首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HQL获取拥有一组中所有项的元素

HQL获取拥有一组中所有项的元素
EN

Stack Overflow用户
提问于 2010-05-21 02:05:34
回答 3查看 4.4K关注 0票数 1

目前,我有一个HQL查询,它从一组指定的奖励中返回所有拥有奖励的成员:

代码语言:javascript
运行
复制
from Member m left join m.awards as a where a.name in ("Trophy","Ribbon");

我现在需要的是HQL,它将返回所有拥有所有奖励的成员。

因此,假设这些数据:

代码语言:javascript
运行
复制
Joe has Trophy, Medal
Sue has Trophy, Ribbon
Tom has Trophy, Ribbon, Medal

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

以下是类结构(简化):

代码语言:javascript
运行
复制
class Member {
  private String name;
  private Set<Award> awards;
}
class Award {
  private String name;
}
EN

回答 3

Stack Overflow用户

发布于 2010-05-21 03:05:28

代码语言:javascript
运行
复制
select m from Member m left join m.awards as a where a.name in ("Trophy","Ribbon") group by m having count(a)=2
票数 3
EN

Stack Overflow用户

发布于 2013-10-10 12:40:04

只是重复我自己..。获取完全具有给定奖项集合的成员的代码:

代码语言:javascript
运行
复制
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"} 
) 
票数 2
EN

Stack Overflow用户

发布于 2013-02-05 12:13:32

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

代码语言:javascript
运行
复制
getSession().createQuery(hql).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2879161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档