[RESOLVIDO] Passar Parâmetro de uma NamedQuery em DAO Genérico

1 resposta
P

Alguém sabe como faço para passar o parâmetro de uma NamedQuery para um método getList de um DAO genérico?

Eu faço uma chamada ao método dessa forma:
daoRNC.getList(this.rnc.getClass(), “Tbrnc.findByCnpj”,this.varEmpresa);

E recebo a seguinte mensagem:
java.lang.IllegalArgumentException: You have attempted to set a parameter at position 1 which does not exist in this query string SELECT t FROM Tbrnc t WHERE t.cnpj = :cnpj.

Segue código do método:

public  List getList(Class classToCast,String jpql, Object parameters) {

List toReturn = null;

Query qr = entityManager.createNamedQuery(jpql);

for (int i = 0; i < parameters.length; i++) {

qr.setParameter(i + 1, parameters[i]);

}

entityManager.getTransaction().begin();

toReturn = qr.getResultList();

entityManager.getTransaction().commit();

entityManager.close();

return toReturn;

}

1 Resposta

P

Segue a resolução que encontrei para quem precisar:

  1. Quando uso um método genérico do tipo getList ou getEntity e que passa como parâmetro uma NamedQuery e não uma Query Dinâmica, a NamedQuery em questão deve possuir parâmetros posicionais e não nomeados. No meu caso por exemplo a minha NamedQuery estava assim:
    @NamedQuery(name = “Tbrnc.findByCnpj”, query = “SELECT t FROM Tbrnc t WHERE t.cnpj = :cnpj”),

Então quando eu chamava o método abaixo passando-a como parâmetro:
daoRNC.getList(this.rnc.getClass(), “Tbrnc.findByCnpj”,this.varEmpresa);

recebia esse erro:
java.lang.IllegalArgumentException: You have attempted to set a parameter at position 1 which does not exist in this query string SELECT t FROM Tbrnc t WHERE t.cnpj = :cnpj.

Isso porque no meu método getList era é feito um loop para pegar os parâmetros posicionais da NamedQuery e como não havia nenhum, ele me informava que eu estava tentando passar um parâmetro que não existia na Query.

Resolvi a situação apenas passando o parâmetro “:cnpj” para uma parâmetro posicional deixando a query assim:
@NamedQuery(name = “Tbrnc.findByCnpj”, query = “SELECT t FROM Tbrnc t WHERE t.cnpj = ?1”)

dessa forma o método getList funcionou sem problemas.

Criado 12 de fevereiro de 2014
Ultima resposta 13 de fev. de 2014
Respostas 1
Participantes 1