Как получить результат запроса hibernate как ассоциативный массив списка или hashmap
Я разрабатываю приложение в struts 2 и hibernate 3.
у меня 3 таблицы
- инспекции
- InspectionMission
- хронология
Inspection
связан с InspectionMission
и InspectionMission
связан с Timeline
.
теперь у меня есть следующая проблема. Я написал следующий запрос в HQL
public List getQuartewiseInspectionList(){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Query q = session.createQuery(
"select count(i.inspectionId) as tot_inspections,t.year,t.quarter" +
" From Inspection as i " +
" inner join i.inspectionMission as im inner join im.timeline as t" +
" GROUP by t.year,t.quarter");
return q.list();
}
Я хочу получить результат как после
result[0][tot_inspections] = "6"
result[0][year] = "2009";
result[0][quarter] = "Q2";
result[1][tot_inspections] = "3"
result[1][year] = "2009";
result[1][quarter] = "Q3";
и так далее чтобы я мог отобразить его в стойках jsp следующим образом:
в JSP я написал следующий код
<table border="1">
<s:iterator value="result" status="status">
<tr class="<s:if test="#status.even">even</s:if><s:else>odd</s:else>">
<td class="nowrap"><s:property value="tot_inspections" /></td>
<td class="nowrap"><s:property value="year" /></td>
<td class="nowrap"><s:property value="quarter" /></td>
</tr>
</s:iterator>
</table>
может ли кто-нибудь здесь помочь мне?
2 ответов
вы должны использовать синтаксис "новая карта" (Hibernate Reference paragraph 14.6)
select new map(count(i.inspectionId) as tot_inspections, t.year as year, t.quarter as quarter) from ...
остальная часть запроса одинакова. Это вернет список карт, где ключом является псевдоним "столбца".
другим решением было бы определить объект данных только для отображения этих результатов и позволить Hibernate создавать экземпляры тех, кто на лету. Этому классу просто нужен соответствующий конструктор.
пример класса (геттеры и поля опущены)
public class InspectionCount() {
// fields
public InspectionCount(int count, int year, int quarter) {
// initialize instance
}
// getters
}
запрос будет выглядеть
select new InspectionCount(count(i.inspectionId), t.year, t.quarter)
from Inspection as i
inner join i.inspectionMission as im inner join im.timeline as t
group by t.year,t.quarter
в результате вы получите List
of InspectionCount
s.