HQL获取拥有集合中所有项目的元素

目前,我有一个HQL查询,它返回所有拥有任何奖项的会员:

from Member m left join m.awards as a where a.name in ("Trophy","Ribbon"); 

我现在需要的是HQL,它将返回拥有奖项中指定的所有奖项的所有会员。

所以,假设这个数据:

 Joe has Trophy, Medal Sue has Trophy, Ribbon Tom has Trophy, Ribbon, Medal 

上面的查询将返回Joe,Sue和Tom,因为这三个人至少拥有Trophy或Ribbon中的一个。 但我只需要回归苏和汤姆,因为他们是唯一拥有所有指定奖项(奖杯和彩带)的人。

这是类结构(简化):

 class Member { private String name; private Set awards; } class Award { private String name; } 

 select m from Member m left join m.awards as a where a.name in ("Trophy","Ribbon") group by m having count(a)=2 

只是重复一遍……获得完全具有给定奖项的成员的代码:

 from Member m where not exists ( from Award a where a.name in {"Trophy", "Ribbon"} and a not in( select * from Award a2 where a2.owner = m ) ) and not exists ( from Award a3 where a3.owner = m and a3 not in {"Trophy", "Ribbon"} ) 

您可以通过向查询调用IE添加DISTINCT_ROOT_ENTITY结果转换器来强制执行不同的结果:

 getSession().createQuery(hql).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 

我遇到了类似的问题,但我需要做的是(按照你的例子)选择所有成员,他们拥有所有奖项,而不是更多。 因此,在您的示例中,唯一正确的结果是Sue。 有任何想法吗?