0

我正在使用 Play with Excel 模块 1.2.3。在控制器中,我通过调用模型中定义的方法来获取学生列表 - 学生:

List<Student> students= Student.findStudents();

findStudents()定义为:

public static List<Student> findStudents() {
    List<Student> list =  Student.find("colA != colB").fetch();

    return list;
}

然后我通过以下方式渲染excel文件:

renderExcel("student_report");

在 excel 模板中,我使用了 JXLS。例如:

<jx:forEach items="${students}" var="stu">
    ${stu.address.name}                    ${stu.name}
</jx:forEach>

现在,奇怪的事情发生了。stu.name总是显示得很好。但是,仅当我在代码中stu.address.name完成类似操作时才会显示。System.out.println(student.address.name)否则,Excel 报告中的单元格为空白。

谁能解释一下?

NB 学生懒惰地参考地址

4

1 回答 1

0

Jxls 使用 Apache Jexl 来处理属性表达式,例如stu.address.name. Jexl 使用反射来计算对象属性值。但是反射和延迟加载不会进行,因为您不是使用真实对象而是使用代理对象。

当你这样做时System.out.println(student.address.name),真实的对象被实例化并且反射工作正常。

此答案Converting Hibernate proxy to real object中描述了该问题的可能解决方案。或者,当您需要将对象传递给 Jxls 时,您应该进行急切的获取。

于 2015-07-16T17:00:52.353 回答