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