2009-09-11 3 views
4

У меня возникла проблема с созданием подзапросов с Hibernate. К сожалению, класс подзапросов почти полностью без документов, поэтому я не имею абсолютно никакого понятия, как преобразовать следующий SQL в Hibernate Criteria:Подзапрос 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)); 

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

ответ

5

Попытки создать псевдоним для «автомобиля» собственности, прежде чем добавить выражение э так:

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

В первую очередь проверьте конфигурацию ORM между сущностями автомобиля и CarPart, как правило, вам необходимо РЕЖИМОМ УСТАНОВОК отношение между их. После этого попробуйте выполнить следующий код:

List result = session.createQuery("from " + CarPart.class.getName() + 
    " as parts join parts.car as car where car.owner = :myOwner") 
    .setParameter("myOwner", 123) 
    .list(); 
7

Try Как это:

детали таблицы): Категория (номер, имя, убывание, ParentID, активный)

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_ где this_.active = 1 и this_.parentId = ( выберите this0_ .id, как y0 из Категории this0__ где this0_ .parentId является нулевым и this0 _.active = 1 и this0__. name = 'План здоровья' )

Удачи!

-Rohtash Синг

+2

criteria.add (Subqueries.propertyEq ("родитель", субкритериев)); что здесь родитель? –

Смежные вопросы