Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 检查另一个集合中的集合是否包含对象_Hibernate_Hibernate Criteria - Fatal编程技术网

Hibernate 检查另一个集合中的集合是否包含对象

Hibernate 检查另一个集合中的集合是否包含对象,hibernate,hibernate-criteria,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; publi

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

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;
}
我目前的查询是:

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的用户组是否包含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 );

不能在条件查询中链接这样的属性。试一试

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

是的,我也试过类似的东西。但我不断得到“异常(org.hibernate.QueryException):无法解析属性:member of:Document”。它现在似乎正在工作,不得不使用Restrictions.eq(“member.id”,currentUser.id),不知道为什么。
criteria.createAlias("u.userGroup", "userGroup");
criteria.createAlias("userGroup.members", "member");
ugAccess.add(Restrictions.eq("member", currentUser));