Resolvendo o assombroso problema do java.lang.NumberFormatException: For input string:

Bom dia a todos,

Enquanto trabalhava no desenvolvimento de alguns cases de um projeto WEB me deparei com um problema que até o momento eu não tinha visto, simplesmente ao tentar executar uma lógica JSP que tivesse uma listagem de dados o servidor gerava uma exceção com a seguinte mensagem:

Me bati um tempo até entender o que estava realmente acontecendo, mas vamos a completa explicação do acontecido:

A estrutura do meu DAO está sobre o JPA 2 e todas as suas queries eu estou fazendo direto usando JPA-QL para não utilizar nem a CriteriaBuilder do JPA 2 nem a Session/Criteria do Hibernate justamente para garantir um desacoplamento do mecanismo de persistência. Bom, o problema estava justamente na forma de montar essa minha JPA-QL, quanto executo uma query como esta por exemplo:

[sql]
SELECT
f, o
FROM
funcao f
INNER JOIN f.organizacao o
WHERE
o.id = :id
ORDER BY
f.nome ASC
[/sql]

O que eu estou retornando para esse query era para ser uma Collection de objetos do tipo Funcao, só que está sendo retornado uma Collection de array de objetos  Collection<Object[]>. Logo na minha JSP ao iterar essa Collection é disparada uma exception justamente por não existir uma propriedade “f.nome” por exemplo mas apenas “f[1]” por exemplo.

Mas tá, como eu resolvo isso?

Para o meu caso foi simples, simplesmente alterei algumas coisas no meu método de consulta. Primeiramente definindo o tipo do resultado da JPA-QL na consulta, passando um segundo parâmetro no método EntityManager.createQuery(query, type). Neste ponto você tem que tomar cuidado, caso você defina um tipo específico para a sua consulta você não pode misturar os objetos, no meu caso eu tive que selecionar apenas 1 objeto, o objeto do tipo, ficando assim:

[sql]
SELECT
f
FROM
funcao f
INNER JOIN f.organizacao o
WHERE
o.id = :id
ORDER BY
f.nome ASC
[/sql]

Neste meu caso resolveu o problema logo porque eu já tenho o objeto “organizacao” dentro da classe Funcao.

Solução final

No fim das contas o meu método de consulta ficou assim pessoal:

[sql]
public Collection<Funcao> findFuncoesPorOrganizacao(Organizacao organizacao) throws RepositoryException {
String query = “SELECT g FROM funcao g INNER JOIN g.organizacao o WHERE o.id = :id ORDER BY g.nome”;
return this.manager.createQuery(query, Funcao.class)
.setParameter(“id”, organizacao.getId())
.getResultList();
}
[/sql]

Referências

http://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/querycriteria.html

http://www.objectdb.com/java/jpa/query/jpql/select

http://docs.oracle.com/javaee/5/tutorial/doc/bnbtl.html#bnbtm