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);
是的,我也嘗試過這樣的事情。但我不斷收到「Exception(org.hibernate.QueryException):無法解析屬性:成員:Document」。 – mortenoh
它現在似乎工作,不得不使用Restrictions.eq(「member.id」,currentUser.id),不知道爲什麼。 – mortenoh