Hibernate 上更复杂的命名查询

Posted

技术标签:

【中文标题】Hibernate 上更复杂的命名查询【英文标题】:More complicated named queries on Hibernate 【发布时间】:2011-07-18 07:40:01 【问题描述】:

我有一个从 2 个不同表中聚合和分组的查询: SELECT co.name AS companyName, f.destination_id, COUNT(f.id) AS numberOfFlights FROM companies co INNER JOIN flights f ON co.c_id = f.company_id GROUP BY co.id, co.name , f.destination_d

并且,我想将它作为命名查询保存在 xml 映射文件中。 我的问题是: 1. 如您所见,并非所有结果字段都是任何表中的实际列 - 我如何将其告知地图文件? 2. 我应该将它保存在哪个 xml 中 - 在 compant.hbm.xml 或 flight.hbm.xml 上,或者 - 有没有办法将它保存在 hibernate.cfg.xml 中?

我在网上搜索了高级示例,但找不到任何与这种并发症相匹配的东西(尽管它并不那么复杂......)。

谁能给我一个可以学习的好例子,或者可以自己指导我吗?

【问题讨论】:

你打算在很多地方使用查询还是只在一种方法中使用? 【参考方案1】:

对于问题1,看一下ResultTransformer。只需创建一个与查询结果同名的 bean,然后在 Transformers.aliasToBean 调用中将其传递给 ResultTransformer,如下所述: Hibernate: Mapping custom column names in stored procedure named query

对于问题 2,至少在我们的项目中,我们一直将命名查询放入一个仅包含查询的 XML 文件中,并使用以下行从 hibernate.cfg.xml 中引用它:

<mapping resource="queries.hbm.xml" />

【讨论】:

【参考方案2】:

我使用的是 JPA,我相信 Hibernate 也支持它,只需在 META-INF 下的合适目录中创建一个 XML 文件,然后从我的 persistence.xml 中引用它

<persistence-unit name="xxx">
    <jta-data-source>jdbc/xxx</jta-data-source>
    <mapping-file>META-INF/jpql/Xxx.xml</mapping-file>

当我有一个“额外”数据(例如您的计数)时,我经常使用合适的 cnmstructor 定义一个结果类,然后使用

  select new MyClass( thing, computedValue etc ...)

在我的查询中。 Hibernate 似乎支持这种方法。

【讨论】:

很好,但我不能使用 JPA(限制...)。无论如何,我从你的回答中学到了很多,谢谢。 据我了解,select new 并不是JPA特有的,直接Hibernate支持。【参考方案3】:

如果您使用 XML 映射,您可以将命名查询放在 Hibernate 映射文件 (http://www.javalobby.org/java/forums/m91885316.html) 中,如果您使用注释,则可以使用注释 (http://download.oracle.com/javaee/6/api/index.html?javax/persistence/NamedQuery.html)。

另一个选项,尤其是当您将查询中的元素与其他映射连接时,是创建一个数据库,在 Hibernate 中查看它的映射。

【讨论】:

以上是关于Hibernate 上更复杂的命名查询的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate框架学习——批量查询(概述)

Hibernate 命名查询数据库或缓存?

Hibernate-ORM:14.Hibernate中的命名查询

org.hibernate.MappingException 命名查询未知

hibernate10--命名查询

Hibernate 命名查询的表名问题