Consulta de criterios que busca filas usando una subclase específica

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?

preguntado el 22 de mayo de 12 a las 14:05

¿Cómo es tu mapeo? ¿Usas un discriminador? -

¿Por qué usar HQL no es una opción? Criteria API no expone la funcionalidad completa de Hibernate. -

2 Respuestas

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

Eso solo devolvería una lista de engranajes automáticos. -1 por esto- Raul René

@RaulGogo: Eso es lo que pensé que quería hacer :S ¿Entiendes diferente? - Selim

Quiere una lista de carros con cambios automáticos. - Raul René

Tal vez suene un poco como una sobrecarga, pero podría hacerlo en 2 pasos:

  1. Recuperar todos los ids de los Cambios Automáticos:

    List<Long> automaticGearIds = getSession().createCriteria(AutomaticShift.class)
                                            .setProjection(Projections.distinct(Property.forName("id")))
                                            .list();
    
  2. 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 or haz tu propia pregunta.