Как получить результат запроса гибернации в виде ассоциативного массива списка или hashmap - PullRequest
12 голосов
/ 29 мая 2009

Я разрабатываю приложение в стойках 2 и hibernate 3.

У меня есть 3 таблицы

  1. Inspection
  2. InspectionMission
  3. 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>

Может ли кто-нибудь здесь помочь мне?

Ответы [ 2 ]

28 голосов
/ 29 мая 2009

Вы должны использовать синтаксис «новой карты» (Hibernate Reference, параграф 14.6)

select new map(count(i.inspectionId) as tot_inspections, t.year as year, t.quarter as quarter) from ...

Остальная часть запроса такая же. Это вернет список карт, где ключ является псевдонимом «столбца».

1 голос
/ 29 мая 2009

Другое решение - определить объект данных только для отображения этих результатов и позволить 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 из InspectionCount с.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...