目前,我有一个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,因为这三个人都至少拥有一个奖杯或丝带。但我只需要返回苏和汤姆,因为他们是唯一拥有所有指定的奖项(奖杯和丝带)。
以下是类结构(简化):
class Member {
private String name;
private Set<Award> awards;
}
class Award {
private String name;
}
发布于 2010-05-21 03:05:28
select m from Member m left join m.awards as a where a.name in ("Trophy","Ribbon") group by m having count(a)=2
发布于 2013-10-10 12:40:04
只是重复我自己..。获取完全具有给定奖项集合的成员的代码:
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"}
)
发布于 2013-02-05 12:13:32
通过向查询调用IE添加一个DISTINCT_ROOT_ENTITY结果转换器,可以强制执行不同的结果:
getSession().createQuery(hql).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
我有一个类似的问题,但我需要做的是(按照你的例子)选择所有的成员,谁拥有所有的奖项,而不是更多。因此,在您的示例中,唯一正确的结果是Sue。有什么想法吗?
https://stackoverflow.com/questions/2879161
复制相似问题