您好我遇到了迭代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...
也有兴趣,但它也没有告诉我有关我的领域给我信息的位置。
答案 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>
。