如何将休眠查询结果提取为列表或哈希映射的关联数组

2022-09-03 00:04:45

我正在 struts 2 和 hibernate 3 中开发一个应用程序。

我有 3 张桌子

  1. 检查
  2. 检验委托
  3. 时间线

Inspection与 相关联,并与 相关联。InspectionMissionInspectionMissionTimeline

现在我有以下问题。我已经在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

您必须使用“新映射”语法(休眠参考第14.6段)

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

查询的其余部分是相同的。这将返回一个映射列表,其中键是“列”的别名。


答案 2

另一种解决方案是定义一个数据对象,仅用于显示这些结果,并让Hibernate动态创建这些结果的实例。此类只需要一个匹配的构造函数。

示例类(省略 getter 和字段)

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

结果,你会得到一个s。ListInspectionCount


推荐