La visualizzazione dei risultati Hibernate / JPA nelle cause Datable di JSF: java.lang.NumberFormatException: Per la stringa di input: “”

Ho inizialmente la query seguente per ottenere List :

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

Questo è reso correttamente nel seguente datatable:

 

Tuttavia, quando provo a recuperarlo da 2 tabelle come di seguito:

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

Getta la seguente eccezione:

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

Come è causato e come posso risolverlo?

La tua query Hibernate sta effettivamente restituendo un List , non una List come si suppone erroneamente durante il cast non controllato.

La prova è nella traccia dello stack:

 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 è coinvolto solo quando la base del name (quindi, #{employee} ) rappresenta un array come Object[] non un javabean come Bean . EL sta tentando di utilizzare il name per ottenere l’elemento dell’array per indice, che può essere solo un numero intero come #{employee[0]} per il primo elemento. Tuttavia, il valore stringa "name" non è analizzabile come numero intero e quindi questa eccezione.

Hai 2 opzioni per risolvere questo problema:

  • Alterare il codice JSF per aspettarsi un List . Utilizza ad es. #{employee[0]} , #{employee[1]} , ecc.

             
  • Correggere la query Hibernate per restituire una vera List .

Guarda anche:

  • NumberFormatException per input String

Per restituire “un vero List ” invece di un List , come dice @BalusC, devi specificare la class delle istanze risultanti.

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

Eccolo: EntityUser.class .