2013-01-08 316 views
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); 

这给了我几乎我想要的,期待检查附加到你的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); 

这似乎工作,但它实际上删除的两个第一部分或,所以它仅适用什么内连词。

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

解决:

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

你不能在一个条件查询链这类似。尝试

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

是的,我也尝试过这样的事情。但我不断收到“Exception(org.hibernate.QueryException):无法解析属性:成员:Document”。 – mortenoh

+0

它现在似乎工作,不得不使用Restrictions.eq(“member.id”,currentUser.id),不知道为什么。 – mortenoh

相关问题