Consulta de criterios que busca filas usando una subclase específica
Frecuentes
Visto 3,225 veces
3
Comenzaré con un ejemplo desinfectado.
En mi sistema, tengo la clase Coche. Car tiene una serie de campos, entre los que se encuentra la instancia gearShift de la clase GearShift.
public class Car {
private GearShift gearShift;
// Snip
}
GearShift es una clase abstracta, de la que heredan AutomaticShift y StickShift. Esto está mapeado en Hibernate como tabla por subclase.
Ahora, digamos que quiero los autos con cambios de marcha automáticos. Preferiría hacer esto a través de los criterios de Hibernate, así que imagino una restricción "ofType" que puedo agregar, como se muestra a continuación.
getSession().createCriteria(Car.class)
.add(Restrictions.ofType(AutomaticShift.class)
.list();
¿Es posible esto de alguna manera?
2 Respuestas
9
VIEJO:
¿Qué tal esto?
getSession().createCriteria(AutomaticShift.class).list()
EDIT:
Esto debería funcionar;
getSession().createCriteria(Car.class).createAlias("gearShift", "gs").add(Restrictions.eq("gs.class", AutomaticShift.class)).list();
contestado el 23 de mayo de 12 a las 14:05
0
Tal vez suene un poco como una sobrecarga, pero podría hacerlo en 2 pasos:
Recuperar todos los ids de los Cambios Automáticos:
List<Long> automaticGearIds = getSession().createCriteria(AutomaticShift.class) .setProjection(Projections.distinct(Property.forName("id"))) .list();
Consigue todos los coches con cambios automáticos:
return getSession().createCriteria(Car.class).add(Restrictions.in("gearShift.id", automaticGearIds)).list();
contestado el 22 de mayo de 12 a las 15:05
Usar Restrictions.in en este caso es una mala práctica. - vhtc
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas java hibernate criteria table-per-subclass or haz tu propia pregunta.
¿Cómo es tu mapeo? ¿Usas un discriminador? - Selim
¿Por qué usar HQL no es una opción? Criteria API no expone la funcionalidad completa de Hibernate. - Danubian Sailor