Перевести подзапросы HQL в критерии - PullRequest
2 голосов
/ 07 сентября 2011

Я хотел бы перевести эту структуру HQL:

FROM Entity_1 obj
WHERE obj IN (FROM Entity2) OR 
      obj IN (FROM Entity3)

Как это можно сделать?

Ответы [ 2 ]

1 голос
/ 25 июля 2013

Я довольно новичок в HQL, но я бы предложил что-то вроде следующего:

 DetachedCriteria sub1 = DetachedCriteria.forClass(Entitiy2);
 DetachedCriteria sub2 = DetachedCriteria.forClass(Entity3);

 Criteria criteria = getYourSession().createCriteria(Entity_1.class, "obj");
 criteria.add(Restrictions.or(Subqueries.propertyIn("obj", sub1), Subqueries.propertyIn("obj", sub2));

Пожалуйста, поправьте меня, если я ошибаюсь.

1 голос
/ 07 сентября 2011

Это объясняется в документации по критериям Hibernate: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html#querycriteria-detachedqueries

DetachedCriteria также может использоваться для выражения подзапроса.Экземпляры критериев, включающие подзапросы, можно получить через подзапросы или свойства.

DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)
    .setProjection( Property.forName("weight").avg() );
session.createCriteria(Cat.class)
    .add( Property.forName("weight").gt(avgWeight) )
    .list();

DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)
    .setProjection( Property.forName("weight") );
session.createCriteria(Cat.class)
    .add( Subqueries.geAll("weight", weights) )
    .list();

Также возможны коррелированные подзапросы:

DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2")
    .setProjection( Property.forName("weight").avg() )
    .add( Property.forName("cat2.sex").eqProperty("cat.sex") );
session.createCriteria(Cat.class, "cat")
    .add( Property.forName("weight").gt(avgWeightForSex) )
    .list();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...