【问题标题】:How to write jstl code for Hibernate returning two Entities如何为 Hibernate 返回两个实体编写 jstl 代码
【发布时间】:2013-02-04 10:04:08
【问题描述】:

我有一个如下所示的休眠代码,它返回单个实体类:

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 代码

这是我的休眠代码:

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页面上显示以上结果?

【问题讨论】:

  • 那么,是List&lt;RecordSet&gt; 还是List&lt;Object[]&gt;?应该显示什么?怎么样?
  • 从您的问题中不清楚为什么您提供的 JSTL 对这两种情况都不起作用。您可以发布您的支持对象的代码吗?
  • 当我调用 list() 方法时,我可以使用具有 obj[0]={Master obj,DateRange obj} 等的 Object 数组项......
  • 我用过但忘了在上面的链接中提到公共类Master扩展RecordSet和公共类DateRange扩展RecordSet

标签: java spring hibernate jstl hibernate-mapping


【解决方案1】:

所以实际上你有一个List&lt;Object[]&gt;,并且列表中的每个Object[] 都包含一个 Master 实例作为其第一个元素,以及一个 DateRange 实例作为其第二个元素。

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

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

然后遍历您的List&lt;Object[]&gt; 并创建一个List&lt;MasterAndDateRange&gt;

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

然后,在 JSP 中,使用 JSTL 遍历这个列表:

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

【讨论】:

  • 你能给我示例代码吗?我该如何迭代,我试过但面临类型转换异常
  • 对象列表 = query.list();迭代器它=list.iterator(); while(it.hasNext()){ MasterAndDateRange obj1 = (MasterAndDateRange)it.next(); }
  • 我尝试过但面临类型转换异常 Object cannot be cast to MasterAndDateRange,能否提供示例代码
  • 重读答案的前两句:你有一个List。您可以将此 List 转换为 List。通过遍历 List,将每个 Object[] 转换为 MasterDateRange 实例,然后添加到新的 List
  • 不,我不能。提供代码是你的工作。迭代一个列表并不是你应该害怕的。
【解决方案2】:

根据您的代码,您正在调用存储过程,而不仅仅是单表查询。因此休眠将只返回对象列表。

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

@JB Nizet 建议的其他选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 2018-06-18
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多