Hibernate上更复杂的命名查询

时间:2011-07-18 07:40:01

标签: hibernate hibernate-mapping named-query

我有一个来自两个不同表的聚合和组合的查询:

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中?

我在网上搜索了高级示例,但找不到任何符合此类并发症的内容(尽管它并不是那么复杂......)。

任何人都可以向我提供一个我可以学习的好榜样,或者可以自己指导我吗?

3 个答案:

答案 0 :(得分:3)

对于问题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" />

答案 1 :(得分:1)

我使用JPA,Hilenate也支持我,并且只需在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支持这种方法。

答案 2 :(得分:0)

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

另一个选项,特别是如果你将查询中的元素与其他映射相连接,就是创建一个数据库,在Hibernate中查看它的地图。