繁体   English   中英

HQL以获取在一组中拥有所有项目的元素

[英]HQL to get elements that possess all items in a set

当前,我有一个HQL查询,该查询返回一组指定奖励中所有拥有ANY奖励的会员:

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之一。 但是我只需要归还Sue和Tom,因为他们是唯一拥有所有指定奖项(奖杯和丝带)的人。

这是类结构(简化):

class Member {
  private String name;
  private Set<Award> 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。 有任何想法吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM