2013-12-06 2 views
10

Я пытаюсь сделать что-то подобное, но с использованием Criteria вместо HQL:Hibernate Критерии «в подвыборках»

select user from User where user in (
    select user from UserDomain where domain.id = "XXX" 
) 

Пользователь является субъектом, имеющим one-to-many отношения к присоединиться к таблице UserDomain. Здесь нужно просто найти пользователей, связанных с Domain с id = "XXX".

Это похоже на то, что это должно быть очень просто ... но мне не повезло до сих пор приносить полезные полезные документы.

ответ

3

В обычных случаях можно преобразовать в объединение. Tyr:

Criteria c = session.createCriteria(User.class, "u"); 
c.createAlias("u.userDomain", "ud"); // inner join by default 
c.add(Restrictions.le("ud.id", 1)); 
+0

Нет, нет отношения «u.userDomain». User.userDomains является отношением to-many к таблице соединений UserDomain. – Marc

22

подзапрос очень полезно в тех случаях, что вам нужно искать пользователя, имеющего один к -many UserDomains. В этом случае WHERE UserId IN (subquery) приносит большое преимущество: мы все еще работаем с плоской таблицей/сущностью User ... поэтому мы можем сделать правильный пейджинг.

Вот документация 15.8. Detached queries and subqueries

Проект может быть: подзапрос:

DetachedCriteria userSubquery = DetachedCriteria.forClass(UserDomain.class, "ud") 
    // Filter the Subquery 
    .add(Restrictions.eq(UserDomain.DOMAIN, domain)) 
    // SELECT The User Id 
    .setProjection(Projections.property("ud.userId")); 

И главный вопрос:

Criteria query = session.createCriteria(User.class, "u") 
    .add(Subqueries.propertyIn("u.id", userSubquery)); 

Теперь у нас есть запрос, который может быть использован для paging

+0

На небольшой коррекции, я думаю, вы имели в виду «.add (Subqueries.propertyIn (« id », userSubquery))». Ваш пример вызывает некоторые исключения для исключения критического класса. –

+0

В качестве примечания: вы можете столкнуться с «Class Cast Exception», как если бы вы попытались изменить 'Subqueries.propertyIn (« u.id », userSubquery)' to 'Subqueries.eq (« u.id », userSubquery) '- не делайте этого, даже если для подзапроса есть одно совпадение. – dominik

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