私はこのようなことをしようとしていますが、Criteria
の代わりにHQL
を使用しています。
select user from User where user in (
select user from UserDomain where domain.id = "XXX"
)
ユーザーは、結合テーブルUserDomainに対してone-to-many
関係を持つエンティティです。ここでのポイントは、id = "XXX"のDomain
にリンクされているユーザーを見つけることです。
これは非常に単純なはずです...しかし、これまでのところ、有用なドキュメントを表示することができません。
ついに見つけました。結局のところ、それほど難しくはなかったことがわかりました...一度知ったら!
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
サブクエリは、one-to-manyUserDomainsを持つユーザーを検索する必要がある場合に非常に役立ちます。その場合、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) );
これで、ページングに使用できるクエリができました。
節では通常、結合に変換できます。これをTyr:
Criteria c = session.createCriteria(User.class, "u");
c.createAlias("u.userDomain", "ud"); // inner join by default
c.add(Restrictions.le("ud.id", 1));