使用 HQL 的新对象

Posted

技术标签:

【中文标题】使用 HQL 的新对象【英文标题】:New object with HQL 【发布时间】:2011-04-30 23:30:13 【问题描述】:

尝试从 HQL 查询创建对象,但无法弄清楚我做错了什么。

查询:

String query = "SELECT product.code, SUM(product.price), COUNT(product.code)
from Product AS product
GROUP BY product.code"

(或者我应该使用 new MyCustomList(product.code, SUM(... ,即使它没有映射?) 现在我想把这个返回的列表转换成一个类似的对象:

class MyCustomList
  public String code;
  public BigDecimal price;
  public int total;

  // Constructor
  public MyCustomList(String code, String price, int total) //...

检索数据:

// This throws ClassCastException    
List<MyCustomList> list = MyClass.find(query).fetch();

使用 Play 框架

【问题讨论】:

【参考方案1】:

我知道这是一个旧帖子,但您也可以用于 HQL:

Query query = session.createQuery("SELECT code AS code FROM Product"); 

或者这个用于 SQL:

Query query = session.createSQLQuery("SELECT code AS code FROM Product");

与:

query.setResultTransformer(Transformers.aliasToBean(MyCustomList.class));

【讨论】:

值得注意的是,setResultTransformer 从 Hibernate 5.2 开始已被弃用【参考方案2】:

我认为15.6. The select clause 部分涵盖了您想要实现的目标:

15.6. The select clause

...

查询可以返回多个对象 和/或属性作为类型数组 Object[]:

select mother, offspr, mate.name
from DomesticCat as mother
    inner join mother.mate as mate
    left outer join mother.kittens as offspr

或作为List

select new list(mother, offspr, mate.name)
from DomesticCat as mother
    inner join mother.mate as mate
    left outer join mother.kittens as offspr

或者——假设类Family 有一个适当的构造函数 - 作为 实际的类型安全 Java 对象:

select new Family(mother, mate, offspr)
from DomesticCat as mother
    join mother.mate as mate
    left join mother.kittens as offspr

在你的情况下,你可能想要:

SELECT new MyCustomList(product.code, SUM(product.price), COUNT(product.code))
from Product AS product
GROUP BY product.code

MyCustomList 不一定是映射实体。

【讨论】:

我尝试了很多次新的 MyCustomList,但如果我没记错的话(不是在那台机器 atm 上)它给了我 ClassNotFound 异常,尽管这些类在 Play 下的同一个包中!模型。 @Indrek:使用完全限定名:select new com.acme.MyCustomList(...) from ... @PascalThivent 请你看看我的问题How to write HQL JOIN query for multiple table's selected Columns using Constructor In The Select Clause 谢谢

以上是关于使用 HQL 的新对象的主要内容,如果未能解决你的问题,请参考以下文章

HQL和SQL

Hibernate:HQL查询

HQL查询

使用hql动态创建对象问题

Hibernate检索方式-HQL

HQL查询——HQL查询的基本用法