检查另一个Set内的Set是否包含一个对象

时间:2013-01-08 09:13:35

标签: hibernate hibernate-criteria

我有一个与此类似的数据模型:

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的两个第一部分,所以它只在结合中应用什么。

这里的正确方法是什么?我需要拆分成子查询吗?

解决:

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 );

1 个答案:

答案 0 :(得分:1)

您无法在条件查询中链接此类属性。尝试

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