3

我最初通过以下查询获得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)
    ...

这是如何引起的,我该如何解决?

4

2 回答 2

7

您的 Hibernate 查询实际上返回 a List<Object[]>,而不是List<Employee>您在未经检查的强制转换期间错误地假设的 a 。

证据在堆栈跟踪中:

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)
    ...

仅当(因此, the )的基数表示一个数组而ArrayELResolver不是javabean时才涉及。EL 正在尝试使用来按索引获取数组项,对于第一项,它只能是整数,就像这样。但是,字符串值不可解析为整数,因此出现此异常。name#{employee}Object[]Beanname#{employee[0]}"name"

您有 2 个选项来解决此问题:

  • 更改 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>.

也可以看看:

于 2013-10-30T13:28:47.423 回答
0

正如@BalusC 所说,要返回“a real List<Object>”而不是 a List<Object[]>,您必须指定结果实例的类。

getEntityManager().createNativeQuery(
                "SELECT * FROM ...",
                 EntityUser.class
).getResultList();

这里是:EntityUser.class

于 2018-08-26T21:17:22.890 回答