“in subselect”的休眠标准

时间:2013-12-06 14:45:26

标签: hibernate nhibernate subquery criteria

我正在尝试做类似的事情,但使用Criteria代替HQL

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

用户是与联接表UserDomain具有one-to-many关系的实体。 这里的要点只是找到链接到Domain的用户,其ID为“XXX”。

这看起来应该非常简单......但到目前为止,我没有运气任何有用的文档。

3 个答案:

答案 0 :(得分:24)

子查询非常有用,您需要搜索具有 one-to-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) );

现在我们有一个查询,可以用于分页

答案 1 :(得分:3)

在子句中通常可以转换为连接。试试这个:

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

答案 2 :(得分:3)

我终于找到了它。事实证明,一旦你知道,它就不那么难了!

criteria = criteria.createCriteria(User.USER_DOMAINS).add(Restrictions.eq(UserDomain.DOMAIN, domain));
是的,有人在Javadoc面前盯着我: http://www.dil.univ-mrs.fr/~massat/docs/hibernate-3.1/api/org/hibernate/Criteria.html