Критерий спящего режима для "в подзапросе"

Я пытаюсь сделать что-то подобное, но используя Criteria вместо HQL:

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

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

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

Ответ 1

Наконец-то я нашел его. Оказывается, все было не так сложно... как только вы это знаете!

criteria = criteria.createCriteria(User.USER_DOMAINS).add(Restrictions.eq(UserDomain.DOMAIN, domain));

Да, есть, глядя на меня прямо в лицо Джавадоку: http://www.dil.univ-mrs.fr/~massat/docs/hibernate-3.1/api/org/hibernate/Criteria.html

Ответ 2

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

Вот документация 15.8. Отдельные запросы и подзапросы

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

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) );

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

Ответ 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));