Estoy intentando crear un pedido en una mesa y uno de los elementos que se van a "ordenar por" resulta ser una propiedad que se encuentra en un extremo de la relación. ¿Especifico la propiedad por el nombre de la clave , el nombre de la propiedad (en la tabla externa) o el nombre de la tabla? Actualmente tiene: order = new Order[]{Order.asc("lastControlDate"), Order.asc("idManufacturer"), Order.asc("model")}; donde en idManufacturer está la clave externa Gracias

Las entidades son Fabricante 1..M Coche en las que:

Fabricante:

public class Manufacturer{
    private Long idManufacturer;
    private String name;

//<editor-fold defaultstate="collapsed" desc="Constructors">
public Manufacturer(){
//getters and setters....

}

Coche:

public class Car {
private long idCar;
private String model;
private Manufacturer manufacturer;
//Constructor, getters and setters...
}

Order = new Order [] {Order.desc ("fabricante"), Order.desc ("modelo")};

public static List<Car> listCarsByManufacturer(Manufacturer name, Order...orders)throws Exception{
        LinkedList<Criterion> criterions = new LinkedList<Criterion>();
        criterions.add(Restrictions.like("Car.manufacturer", name));

        List<Car> cars =carDAO.findAllCars(criterions, orders);
        return cars;
}
1
Dark Star1 29 dic. 2011 a las 13:09
HQL y Criteria nunca usan nombres de tablas y columnas. Trabajan en entidades. Por lo demás, muéstranos tus entidades y tu consulta si quieres ayuda.
 – 
JB Nizet
29 dic. 2011 a las 14:32

1 respuesta

La mejor respuesta

Aún no nos ha mostrado la consulta, en CarDAO.findAllCars().

De todos modos, así es como obtiene una lista de automóviles con una restricción en el nombre de su fabricante y un pedido en su identificación de fabricante:

Criteria c = session.createCriteria(Car.class, "car");
// to add a restriction on a property of manufacturer, you need
// an inner join on manufacturer
c.createAlias("car.manufacturer", "manufacturer"); 
c.add(Restrictions.like("manufacturer.name", name));
// you want to get the car with their manufacturer, so you need a fetch
c.setFetchMode(car.manufacturer", FetchMode.JOIN);
// you want to order by id of manufacturer
c.addOrder(Order.asc("manufacturer.idManufacturer"));

Todo esto está muy bien explicado en el manual de referencia de Hibernate < / a>.

3
JB Nizet 29 dic. 2011 a las 20:48
Perdón. No llegué a esa parte. Es un antiguo proyecto heredado que tiene muchas capas. Estaba extrayendo las partes relevantes antes de tener que irme, pero respondiste a mi pregunta. Solo necesitaba saber cómo especificar 'la propiedad que se ordenará' si es una clave externa. Gracias de nuevo.
 – 
Dark Star1
30 dic. 2011 a las 01:25