【问题标题】:Hibernate Criteria for "in subselect"“在子选择中”的休眠条件
【发布时间】:2013-12-06 14:45:25
【问题描述】:

我正在尝试做这样的事情,但使用Criteria 而不是HQL

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

用户是一个与连接表 UserDomain 有one-to-many 关系的实体。 这里的重点是查找链接到 id = "XXX" 的 Domain 的用户。

这看起来应该很简单......但到目前为止我还没有找到任何有用的文档。

【问题讨论】:

    标签: hibernate nhibernate subquery criteria


    【解决方案1】:

    子查询在您需要搜索具有一对多用户域的用户的情况下非常有用。在这种情况下,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) );
    

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

    【讨论】:

    • 在小幅修正中,我认为您的意思是“.add(Subqueries.propertyIn("id", userSubquery))”。您的示例导致一些神秘的类转换异常。
    • 附带说明:如果您尝试将Subqueries.propertyIn("u.id", userSubquery) 更改为Subqueries.eq("u.id", userSubquery),您可能会遇到'Class Cast Exception' - 即使只有一个匹配项,也不要这样做一个子查询。
    【解决方案2】:

    in 子句通常可以转换为join。说这个:

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

    【讨论】:

    • 不,没有“u.userDomain”关系。 User.userDomains 是与联接表 UserDomain 的一对多关系。
    【解决方案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

    【讨论】:

      猜你喜欢
      • 2017-04-17
      • 2012-02-12
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多