你如何使用Hibernate将raw-sql投影放在一个对象中?

时间:2010-07-06 01:07:00

标签: java sql hibernate orm projection

假设我有一个以下列投影开头的查询:

SELECT t.term as term, count(g.id) as amount

这是原始的sql,我在Hibernate会话对象上使用createSqlQuery。我想做的是将这些投影放在一个具有“term”和“amount”属性的对象中。

使用HQL,我们可以使用“select new ClassName(...)”,但这不适用于原始SQL查询。

我们怎么做?我找回了一堆[LObject的...而且我不知道如何处理它们。如果我可以让Hibernate将它们放入某种非实体值对象中,那就太棒了。

谢谢!

2 个答案:

答案 0 :(得分:2)

  

如果我可以让Hibernate将它们放入某种非实体值对象中,那就太好了。

您可以通过应用“结果转换器”告诉Hibernate从本机SQL查询返回非托管值对象。从参考文档:

  

16.1.5. Returning non-managed entities

     

可以申请一个   ResultTransformer到本机SQL   查询,允许它返回   非管理实体。

sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
        .setResultTransformer(Transformers.aliasToBean(CatDTO.class))
     

此查询指定:

     
      
  • SQL查询字符串
  •   
  • 结果转换器
  •   
     

上面的查询将返回一个列表   已经实例化的CatDTO   并注入NAME和{的值   BIRTHNAME进入其对应的   属性或字段。

答案 1 :(得分:0)

检查http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querysql.html#d0e13696

sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE, DOG_ID FROM CATS").addEntity(Cat.class)

假设您的带有term和amount属性的对象只有那两个对象属性,那么使用您的原始SQL的类似查询应返回这些对象的列表,然后您可以逐个迭代。< / p>