Hibernate подзапрос - PullRequest
       14

Hibernate подзапрос

6 голосов
/ 11 сентября 2009

У меня проблема с созданием подзапросов в Hibernate.К сожалению, класс Subqueries почти полностью не документирован, поэтому я абсолютно не знаю, как преобразовать следующий SQL-код в Критерии Hibernate:

SELECT id
FROM car_parts
WHERE car_id IN ( SELECT id FROM cars WHERE owner_id = 123 )

Я надеялся, что следующее будет «просто работать»:

session.createCriteria(CarParts.class).add(eq("car.owner", myCarOwner));

но, к сожалению, это не так.Похоже, мне действительно нужно использовать класс Subqueries для создания критериев.Но я не смог найти разумного примера, хотя Google, поэтому я спросил его здесь.

Ответы [ 3 ]

8 голосов
/ 30 сентября 2011

Попробуйте, как это:

Детали таблицы): Категория (id, name, desc, parentId, active)

    DetachedCriteria subCriteria = DetachedCriteria
            .forClass(Category.class);
    subCriteria.add(Restrictions.isNull("parent"));
    subCriteria.add(Restrictions.eq("active", Boolean.TRUE));
    subCriteria.add(Restrictions.eq("name", categoryName));
    subCriteria.setProjection(Projections.property("id"));

    Criteria criteria = getSession().createCriteria(Category.class);
    criteria.add(Restrictions.eq("active", Boolean.TRUE));
    criteria.add(Subqueries.propertyEq("parent", subCriteria));

Будет сгенерирован запрос:

выберите * от Категории этой_ где this_.active = 1 и this_.parentId = ( Выбрать this0_ .id as y0 от Категории this0__ где this0_ .parentId равен нулю и этот0 _. активный = 1 и this0 __. name = 'План медицинского страхования' )

Удачи!

-Рохташ Сингх

5 голосов
/ 11 сентября 2009

Попробуйте создать псевдоним для свойства "car" перед добавлением выражения eq, например:

session.createCriteria(CarParts.class)  
        .createAlias("car", "c")  
        .add(eq("c.owner", myCarOwner));  
0 голосов
/ 14 сентября 2009

В качестве первой проверки конфигурации ORM между объектами Car и CarPart обычно требуется настройка отношений между ними. После этого попробуйте выполнить следующий код:

List result = session.createQuery("from " + CarPart.class.getName() + 
    " as parts join parts.car as car where car.owner = :myOwner")
    .setParameter("myOwner", 123)
    .list();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...