0

私はこれに似たデータモデルを持っています:

class User { public long id; }
class UserGroup { public Set<User> members; }
class UserGroupAccess { public String access; public UserGroup userGroup; }

class Document {
  public User owner;
  public String publicAccess;
  public Set<UserGroupAccess> userGroupAccessses;
}

そして、ロジックは次のようになります。

1. If owner = user then allow access
2. If publicAccess ilike r% allow access
3. If on of the userGroupAccesses have access ilike r%
    AND the user is in the userGroup attached to it, then allow access

私の現在のクエリは次のとおりです。

criteria.createAlias( "userGroupAccesses", "u" );
Disjunction root = Restrictions.disjunction();
root.add( Restrictions.ilike( "publicAccess", "r%" ) );
root.add( Restrictions.eq( "owner", currentUser ) );

Conjunction ugAccess = Restrictions.conjunction();
ugAccess.add( Restrictions.ilike( "u.access", "r%" ) );
root.add( ugAccess );

criteria.add( root );

u にアタッチされた userGroup に currentUser が含まれているかどうかのチェックを期待してください。

私は次のようなさまざまなアプローチを試みてきました。

criteria.createAlias( "u.userGroup.members", "member" );
ugAccess.add( Restrictions.eq("member", currentUser) );

しかし、これはうまくいきません。

ここで調べるべきことはありますか?

更新: JB Nizet から概説されたアプローチを使用して、私はこれを得ました:

criteria.createAlias( "userGroupAccesses", "u" );
criteria.createAlias( "u.userGroup", "ug" );
criteria.createAlias( "ug.members", "member" );

Disjunction root = Restrictions.disjunction();
root.add( Restrictions.ilike( "publicAccess", "r%" ) );
root.add( Restrictions.eq( "user", currentUser ) );

Conjunction ugAccess = Restrictions.conjunction();
ugAccess.add( Restrictions.ilike( "u.access", "r%" ) );
ugAccess.add( Restrictions.eq( "member.uid", currentUser.getUid() ) );
root.add( ugAccess );

criteria.add( root );

これは機能しているように見えましたが、実際には or の最初の 2 つの部分が削除されたため、接続詞の内側にあるもののみが適用されます。

ここで正しいアプローチは何でしょうか?サブクエリに分割する必要がありますか?

解決済み:

criteria.createAlias( "userGroupAccesses", "u", JoinType.LEFT_OUTER_JOIN );
criteria.createAlias( "u.userGroup", "ug", JoinType.LEFT_OUTER_JOIN );
criteria.createAlias( "ug.members", "member", JoinType.LEFT_OUTER_JOIN );
4

1 に答える 1

1

Criteria クエリでは、このようなプロパティをチェーンすることはできません。試す

criteria.createAlias("u.userGroup", "userGroup");
criteria.createAlias("userGroup.members", "member");
ugAccess.add(Restrictions.eq("member", currentUser));
于 2013-01-08T11:50:30.247 に答える