Hibernate结果列表转换为获取行

时间:2014-08-19 08:23:10

标签: java sql hibernate

您好我遇到了迭代Hibernate ResultList

的问题

我跟随了来自外部课程的查询:

queryContent = "select distinct c.identity, c.number, c.status, ctr.name, aab.paymentConditions.currency       from AgreementStateBean ast       join ast.currentAgreement aab       join conagr.contract c  where c.agreementStateId = ?   and con.mainContractor = true ? "

我必须总结整个aab.paymentConditions.currency,检查法规和名称的数量。

我想通过迭代结果列表来做到这一点:

    Query q = session.createQuery(queryContent); 
    List result = q.list();
    Long wholeCurrency, numberOfStatutes;

    for(Object res : result){
        //wholeCurrency += res.getColumnName?
    }

我的问题是如何强制res对象有可能得到具体的列值?我在hibernate查询中看过有关创建地图的内容,但我不知道通过添加

来修改查询字符串是一种好习惯
   "new map(" prefix and then ")" 

之前的sql语句

解决方案:

毕竟我决定在查询中使用map。我通过添加hibernate map语句来修改我的外部查询,方法是将'select new map('和from')替换为'。 另外一件事是添加带有键名称的'as'语句,因为没有它们列键是整数。 所以我的查询后面看起来如下:

"select new map( distinct c.identity, c.number, c.status as status, ctr.name as name, aab.paymentConditions.currency as currency  )    from AgreementStateBean ast       join ast.currentAgreement aab       join conagr.contract c  where c.agreementStateId = ?   and con.mainContractor = true ? "

这对我来说是最容易理解的解决方案,我尝试使用'new com.example.MyClass'作为Kostja建议,但在我的情况下,我无法控制传入的查询,所以我不能依赖于pernament构造函数。

new List( select... 

也有兴趣,但它也没有告诉我有关我的领域给我信息的位置。

2 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望对结果进行类型化表示,而不是实体本身。为此,您可以使用构造函数查询:

"SELECT NEW com.example.MyClass( e.name, e.data) FROM Entity e"

MyClass必须有匹配的构造函数。完全资格认证(com.example)不是强制性的AFAIK。

如果您经常使用此查询,则在数据库中创建视图可能是个好主意。您可以将视图映射到实体,就像它是常规表一样,但请注意,您无法通过映射视图存储对数据的更改。

编辑:原来,mapping to an unspecified Map is alright with Hibernate

select new map( mother as mother, offspr as offspr, mate as mate )

答案 1 :(得分:1)

根据http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch11.html#ql-select-clause 你可以用

queryContent = "select new list(distinct c.identity, c.number, c.status, ctr.name, aab.paymentConditions.currency)       from AgreementStateBean ast       join ast.currentAgreement aab       join conagr.contract c  where c.agreementStateId = ?   and con.mainContractor = true ? "

结果是List<List>