2012-03-22 93 views
2

我需要这个的HQL转换:休眠有条件的次

FROM Appointment a WHERE (a.group==null OR :user MEMBER OF a.group.groupMembers) 

到标准。我怎样才能实现一个子标准仅在maincriteria不匹配时才使用?

我想类似的东西,但我卡住:

Criteria subcrit = crit.createCriteria("group"); 
subcrit.createAlias("groupMembers", "gmembers"); 
crit.add(Restrictions.or(Restrictions.eq("group", null), Restrictions.eq("gmembers.snuserId", user.getId()))); 

回答

6

好吧,我发现了一个soulution对我来说: 首先我创建了一个分离的标准,这找到所有组ID用户所在成员:

DetachedCriteria subquery = DetachedCriteria.forClass(Group.class); 
subquery.createAlias("groupMembers", "gm"); 
subquery.add(Restrictions.eq("gm.userId", user.getId())); 
subquery.setProjection(Projections.property("id")); 

那么对于我的主要标准:

crit.add(
      Restrictions.or(
        Restrictions.isNull("group"), 
        Subqueries.propertyIn("group.groupId", subquery) 
        ) 
      ); 

希望它可以帮助别人