如何为Hibernate返回两个实体编写jstl代码

时间:2013-02-04 10:04:09

标签: java spring hibernate jstl hibernate-mapping

我有一个像下面这样的Hibernate代码,它返回单个Entity类:

SQLQuery query = 
                session.createSQLQuery("select * from Employee");
            query.addEntity(Employee.class);
                       List<Employee> emplist= query.list();

对于上面的代码我的Jstl工作代码是:

<c:choose>
<c:when test="${requestScope.size!=0}">
<table border="1">
<tr>
<th>
EmployeeName
</th>
<th>EmployeeDepartment</th>

</tr>
<c:forEach items="${requestScope.absentlist}" var="emps">
<tr>
<td><c:out value="${emps.empno}"/></td>
<td><c:out value="${emps.empname}"/></td>

</tr>


</c:forEach>

但我的要求是为一个正在返回两个实体的Hibernate写一个jstl代码

这是我的Hibernate代码:

SQLQuery query = session
                    .createSQLQuery("CALL AbsentReportproc(:_fromdate,:_todate)");
            query.addEntity(Master.class);
            query.addEntity(DateRange.class);
            query.setParameter("_fromdate", "2012-12-03");
            query.setParameter("_todate", "2012-12-04");

            List<RecordSet> obj = query.list();     
            Iterator it=obj.iterator();

             while(it.hasNext())
                {
                    Object[] obj1 = (Object[]) it.next();
                    for (int i = 0; i < obj1.length; i++) {

                        RecordSet set=(RecordSet)obj1[i];
                        if(set instanceof Master){
                         System.out.println("Employee Code"+((Master) set).getEmpcode());
                         System.out.println("Employee Dept"+((Master) set).getDept());
                         System.out.println("Employee Name"+((Master) set).getEmpname());                   
                        }
                        if(set instanceof DateRange){
                         System.out.println("AbsentDate"+((DateRange) set).getDdate());
                        }
                    }
                }

任何人都可以向我提供JSTL代码以在jsp页面上显示上述结果吗?

2 个答案:

答案 0 :(得分:2)

所以你实际上有一个List<Object[]>,列表中的每个Object[]都包含一个Master作为其第一个元素的实例,以及一个DateRange实例作为它的第二个元素。

首先编写一个包含这两个对象的类,这将使您的代码更易于阅读:

public class MasterAndDateRange {
    private Master master;
    private DateRange dateRange;
    // constructor and getters omitted for brevity
}

然后遍历您的List<Object[]>并创建List<MasterAndDateRange>

然后将此列表存储在请求属性中(例如"listOfMasterAndDateRange")。

然后,在JSP中,使用JSTL迭代此列表:

<c:forEach var="masterAndDateRange" items="listOfMasterAndDateRange">
   ...
   <c:out value="${masterAndDateRange.master.foo}"/>
   ...
   <c:out value="${masterAndDateRange.dateRange.bar}"/>
   ...
</c:forEach>

答案 1 :(得分:0)

根据您的代码,您正在调用存储过程,而不仅仅是单个表查询。因此,hibernate将仅返回Object列表。

您需要迭代循环并填充所需的对象。

其他选项如@JB Nizet所建议。