Как получить результат запроса на спящий режим в виде ассоциативного массива списка или хэш-карты
Я разрабатываю приложение в struts 2 и hibernate 3.
У меня есть 3 таблицы
- Inspection
- InspectionMission
- Timeline
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>
Может ли кто-нибудь здесь помочь мне?
Ответы
Ответ 1
Вам нужно использовать синтаксис "новая карта" (Hibernate Reference пункт 14.6)
select new map(count(i.inspectionId) as tot_inspections, t.year as year, t.quarter as quarter) from ...
Остальная часть запроса такая же. Это вернет список карт, где ключ является псевдонимом "столбца".
Ответ 2
Другим решением было бы определить объект данных только для отображения этих результатов и позволить 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.