jsf - 在 JSF 数据表中显示 Hibernate/JPA 结果会导致 : java. lang.NumberFormatException:对于输入字符串: "[propertyname]"

标签 jsf jpa primefaces datatable

我最初通过以下查询来获取 List<Employee> :

Query query = session.createQuery("select table1 from Table as table1");
this.employees = (List<Employee>) query.list();

这已在下面的数据表中成功呈现:

<p:dataTable var="employee" value="#{bean.employees}">
    <p:column id="name" headerText="Name">
        <h:outputText value="#{employee.name}" />
    </p:column>
    <p:column id="id" headerText="ID" >
        <h:outputText value="#{employee.id}" />
    </p:column>
</p:dataTable>

但是,当我尝试从下面的 2 个表中检索它时:

Query query = session.createQuery("select a.name, b.id from Table1 as a, Table2 as b"); 
this.employees = (List<Employee>) query.list();

它抛出以下异常:

java.lang.NumberFormatException: For input string: "name"
    at java.lang.NumberFormatException.forInputString(Unknown source)
    at java.lang.Integer.parseInt(Unknown source)
    at java.lang.Integer.parseInt(Unknown source)
    at javax.el.ArrayELResolver.toInteger(ArrayELResolver.java:166)
    at javax.el.ArrayELResolver.getValue(ArrayELResolver.java:46)
    ...

这是怎么造成的,如何解决?

最佳答案

您的 Hibernate 查询实际上返回 List<Object[]> ,不是List<Employee>正如您在未经检查的 Actor 阵容中错误地假设的那样。

证据位于堆栈跟踪中:

java.lang.NumberFormatException: For input string: "name"
    at java.lang.NumberFormatException.forInputString(Unknown source)
    at java.lang.Integer.parseInt(Unknown source)
    at java.lang.Integer.parseInt(Unknown source)
    at javax.el.ArrayELResolver.toInteger(ArrayELResolver.java:166)
    at javax.el.ArrayELResolver.getValue(ArrayELResolver.java:46)
    ...

ArrayELResolver 涉及 name 的基数(因此, #{employee} )表示类似 Object[] 的数组不是像Bean这样的javabean 。 EL 正在尝试使用 name通过索引获取数组项,该索引只能是整数,如 #{employee[0]}对于第一项。但是,字符串值 "name"无法解析为整数,因此出现此异常。

您有两种选择来解决此问题:

  • 更改 JSF 代码以期望 List<Object[]> 。使用例如#{employee[0]} , #{employee[1]}

    <p:dataTable var="employee" value="#{bean.employees}">
        <p:column id="name" headerText="Name">
            <h:outputText value="#{employee[0]}" />
        </p:column>
        <p:column id="id" headerText="ID" >
            <h:outputText value="#{employee[1]}" />
        </p:column>
    </p:dataTable>
    
  • 修复 Hibernate 查询以返回真实 List<Employee> .

另请参阅:

关于jsf - 在 JSF 数据表中显示 Hibernate/JPA 结果会导致 : java. lang.NumberFormatException:对于输入字符串: "[propertyname]",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29094320/

相关文章:

jpa - 如何在 JPA 中正确执行多对多连接表?

mysql - @MapsId 以及与 session 关联的具有相同标识符值的两个对象

java - 插入数据表后显示数据错误

jsf - 仅显示图像的命令按钮

sql - 如何在表上选择并计算某些值的出现次数

css - 使用 p/h :panelGrid columns 内的链接

jsf - 在 JSF 2.0 中动态创建输入字段并将其链接到支持 bean

ajax - jsf primefaces fileupload 提交

jsf - JSTL c :forEach does not iterate through a collection

css - Primefaces 和 primefaces mobile 之间的区别