我正在尝试做类似的事情,但使用Criteria
代替HQL
:
select user from User where user in (
select user from UserDomain where domain.id = "XXX"
)
用户是与联接表UserDomain具有one-to-many
关系的实体。
这里的要点只是找到链接到Domain
的用户,其ID为“XXX”。
这看起来应该非常简单......但到目前为止,我没有运气任何有用的文档。
答案 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