Mostrando resultados de Hibernate / JPA em causas de dados do JSF: java.lang.NumberFormatException: Para cadeia de input: “”

Eu tenho inicialmente a consulta abaixo para obter List :

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

Isso é renderizado com sucesso abaixo da tabela de dados:

 

No entanto, quando tento recuperá-lo de 2 tabelas como abaixo:

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

Ele lança a seguinte exceção:

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

Como isso é causado e como posso resolvê-lo?

Sua consulta do Hibernate está realmente retornando um List , não uma List como você assumiu incorretamente durante a conversão não verificada.

A evidência está no rastreio da pilha:

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

O ArrayELResolver é envolvido quando a base do name (assim, o #{employee} ) representa um array como Object[] não um javabean como o Bean . EL está tentando usar o name para obter o item da matriz por índice, que pode ser apenas um número inteiro assim #{employee[0]} para o primeiro item. No entanto, o valor da cadeia de caracteres "name" não é passível de ser analisado como um número inteiro e, portanto, essa exceção.

Você tem duas opções para resolver esse problema:

  • Altere o código JSF para esperar uma List . Use por exemplo #{employee[0]} , #{employee[1]} , etc.

             
  • Corrija a consulta do Hibernate para retornar uma List real List .

Veja também:

  • NumberFormatException para input String

Para retornar “uma List real List ” em vez de uma List , como o @BalusC diz, você deve especificar a class das instâncias resultantes.

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

Aqui está: EntityUser.class .