使用 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 的新对象的主要内容,如果未能解决你的问题,请参考以下文章