2013-01-08 309 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

相關問題