Критерий запроса поиска строк с использованием определенного подкласса
Начну с продезинфицированного примера.
В моей системе у меня есть класс Car. У автомобиля есть несколько полей, среди которых есть экземпляр gearShift класса GearShift.
public class Car {
private GearShift gearShift;
// Snip
}
GearShift - это абстрактный класс, от которого наследуются AutomaticShift и StickShift. Это отображается в Hibernate как таблица на подкласс.
Теперь, скажем, я хочу получить автомобили с автоматическим переключением передач. Я бы предпочел сделать это с помощью критериев Hibernate, поэтому я представляю себе ограничение "ofType", которое я могу добавить, как показано ниже.
getSession().createCriteria(Car.class)
.add(Restrictions.ofType(AutomaticShift.class)
.list();
Возможно ли это каким-либо образом?
2 ответа
OLD:
Как насчет этого?
getSession().createCriteria(AutomaticShift.class).list()
РЕДАКТИРОВАТЬ:
Это должно сработать;
getSession().createCriteria(Car.class).createAlias("gearShift", "gs").add(Restrictions.eq("gs.class", AutomaticShift.class)).list();
Может быть, это немного похоже на накладные расходы, но вы можете сделать это в 2 этапа:
Получить все идентификаторы автоматических передач:
List<Long> automaticGearIds = getSession().createCriteria(AutomaticShift.class) .setProjection(Projections.distinct(Property.forName("id"))) .list();
Получить все автомобили с автоматическими передачами:
return getSession().createCriteria(Car.class).add(Restrictions.in("gearShift.id", automaticGearIds)).list();