如何将hibernate查询结果作为列表或hashmap的关联数组获取

时间:2009-05-29 10:34:34

标签: java hibernate struts

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

我有3张桌子

  1. 检验
  2. InspectionMission
  3. 时间轴
  4. InspectionInspectionMission相关联,InspectionMissionTimeline相关联。

    现在我有以下问题。我在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 struts中显示它,如下所示:

    在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 个答案:

答案 0 :(得分:28)

你必须使用“新地图”语法(Hibernate Reference第14.6段)

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

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

答案 1 :(得分:1)

另一种解决方案是定义一个数据对象,仅用于显示这些结果,让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

因此,您将获得List InspectionCount s。