web-dev-qa-db-ja.com

「副選択内」の休止状態基準

私はこのようなことをしようとしていますが、Criteriaの代わりにHQLを使用しています。

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

ユーザーは、結合テーブルUserDomainに対してone-to-many関係を持つエンティティです。ここでのポイントは、id = "XXX"のDomainにリンクされているユーザーを見つけることです。

これは非常に単純なはずです...しかし、これまでのところ、有用なドキュメントを表示することができません。

11
Marc

ついに見つけました。結局のところ、それほど難しくはなかったことがわかりました...一度知ったら!

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

3
Marc

サブクエリは、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) );

これで、ページングに使用できるクエリができました。

27
Radim Köhler

節では通常、結合に変換できます。これをTyr:

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