2012-03-22 94 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) 
        ) 
      ); 

希望它可以幫助別人