查询具有两个一对多集合的休眠实体

Posted

技术标签:

【中文标题】查询具有两个一对多集合的休眠实体【英文标题】:Querying a hibernate entity with two one-to-many collections 【发布时间】:2011-02-11 17:31:44 【问题描述】:

我正在使用 Hibernate 选择若干 (x) 个实体 Foo。每个 foo 都有一对多的集合 bar 和 baz 设置为延迟获取。我需要为每个 foo 填充 bar 和 baz,所以我绝对不希望每个集合都发布一个子选择(2 * x + 1 个选择)。

但是,我也不一定要在两者上都设置 setFetchMode(FetchMode.JOIN),因为这将返回笛卡尔积 (bar x baz)。此外,如果我将 foo 和 bar 定义为列表,我将收到重复的项目。我可以发布两个标准:

List<Foo> foos;
foo = session.createCriteria(Foo.class).setFetchMode("bar", FetchMode.JOIN).list();
foo = session.createCriteria(Foo.class).setFetchMode("baz", FetchMode.JOIN).list();

但代码看起来相当草率。看起来第一个查询是不必要的。有没有更简洁的方法来获取 bar 和 baz?

【问题讨论】:

【参考方案1】:

我会转储标准并为此使用 HQL。

String hql = "select new list(foo.bar, foo.baz) from Foo foo";
Query query = session.createQuery(hql);
List list = query.list;
Bar bar = list.get(0);
Baz baz = list.get(1);

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html

【讨论】:

什么是 foo 有我想要的其他成员(非集合)?你也会单独选择它们吗? 你可以,你也可以说 select foo.name, new list(foo.bar, foo.baz) ...我认为我的查询实际上返回了一个列表列表。但是你可以玩它。您还可以返回地图。 "select new map(max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n). etc. have fun. from Cat cat" 任何具有匹配构造函数的东西。 我现在坚持使用两个 Criteria 查询,但感谢您的出色回答 ;-)

以上是关于查询具有两个一对多集合的休眠实体的主要内容,如果未能解决你的问题,请参考以下文章

具有一对多关系的灵活查询

休眠一对多关联删除

MyBatis---集合查询(一对多)

如何使用同一列休眠设置多个一对多关系

休眠一对多注释外键空

Doctrine 对一对多关系进行了许多查询