您好,我在迭代 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 替换为 'select new map(' 和 from ') 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 ? "
这对我来说是最合适的解决方案,我按照 Kostja 的建议尝试使用“NEW com.example.MyClass”,但就我而言,我无法控制传入查询,因此我不能依赖永久构造函数。
new List( select...
也很感兴趣,但它也没有告诉我我的职位可以为我提供信息。
最佳答案
如果我理解正确的话,您希望得到结果的类型化表示,而不是它本身是一个实体。为此,您可以使用构造函数查询:
"SELECT NEW com.example.MyClass( e.name, e.data) FROM Entity e"
MyClass
必须有一个匹配的构造函数。据我所知,完全资格(com.example
)不是强制性的。
如果您经常使用此查询,在数据库中创建 View 可能是个好主意。您可以将 View 映射到实体,就像它是常规表一样,但请注意,您无法通过映射 View 存储对数据的更改。
编辑:结果是,mapping to an unspecified Map is alright with Hibernate :
选择新 map (mother为mother,offspr为offspr,mate为mate)
关于java - Hibernate 结果列表转换以获取行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25378732/