Order by dinamico em JPQL

30/01/2013

1

Boa noite a todos, estou com um problema, tenho uma namedquery que passo vários parâmentros inclusive o "orderby", alquém sabe alguma solução, pois da maneira que esta abaixo, o SQL gerado pelo JPA no log do tomcat aparece o certo, mas no resultado sai desordenado.
Estou usando JPA 2.0, com EclipseLink.
  "SELECT new entidades.com.ComCotacao3(c.idcodigo3, c.descricao3, c.datainc3, c.prazolancamento3, c.status3, c.qtditens3) "+
  " FROM ComCotacao3 c "
+ " WHERE c.todosfornecedores3 = :todosfornecedores3 or"
+ " (c.fk_ger_grupofor3 is null or c.fk_ger_grupofor3 = :fk_ger_grupofor3) "
+ " ORDER BY :orderby")

Responder

Posts

31/01/2013

Davi Costa

Já pensou em usar criteria?

att Davi
Responder

31/01/2013

Danilo Gomes

Realmente, nesse caso faz muito mais sentido usar criteria.

Criterias têm como principal vantagem serem dinâmicas. Facilitaria bastante sua vida.
Responder

07/02/2013

Fernando Silva

Então pessoal até tentei usar o criteria, mas da forma que estou trabalhando esta meio difícil, mas vamos lá, vou postar pra ver se me dão uma ideia.
No código esta a explicação.

//Aqui gostaria de passar uma lista com estes campos a serem retornados, pra ficar dinamico
//Geralmente eu passo uma lista com os campos e faço um for para formar a JPQL, o que não consegui com exemplo abaixo
cq.multiselect(cotRoot.get("idcodigo3"),cotRoot.get("descricao3"),cotRoot.get("datainc3"),cotRoot.get("prazolancamento3"),
               cotRoot.get("status3"),cotRoot.get("qtditens3"));

//Para o order by esta perfeito, só no select e where que não consigo fazer um metodo dinamico.
cq.orderBy(cb.asc(cotRoot.get(_pesquisa.getOrderBy())));

//Este orderby tambem tem que ser dinamico ora vai ser varios campos a serem comparados hora não ai queria passar somente 
//Os que vão ser comparados, por exemplo campo todosfornecedores3, tem momento que não vou compara-lo e assim vai
cq.where(cb.or(cb.equal(cotRoot.get("todosfornecedores3"), _pesquisa.getListaValorPesquisa().get(0)), cb.or(cb.isNull(cotRoot.get("fk_ger_grupofor3")),cb.equal(cotRoot.get("fk_ger_grupofor3"),_pesquisa.getListaValorPesquisa().get(1)))));


Responder

07/02/2013

Fernando Silva

Então pessoal até tentei usar o criteria, mas da forma que estou trabalhando esta meio difícil, mas vamos lá, vou postar pra ver se me dão uma ideia.
No código esta a explicação.

//Aqui gostaria de passar uma lista com estes campos a serem retornados, pra ficar dinamico
//Geralmente eu passo uma lista com os campos e faço um for para formar a JPQL, o que não consegui com exemplo abaixo
cq.multiselect(cotRoot.get("idcodigo3"),cotRoot.get("descricao3"),cotRoot.get("datainc3"),cotRoot.get("prazolancamento3"),
               cotRoot.get("status3"),cotRoot.get("qtditens3"));

//Para o order by esta perfeito, só no select e where que não consigo fazer um metodo dinamico.
cq.orderBy(cb.asc(cotRoot.get(_pesquisa.getOrderBy())));

//Este orderby tambem tem que ser dinamico ora vai ser varios campos a serem comparados hora não ai queria passar somente 
//Os que vão ser comparados, por exemplo campo todosfornecedores3, tem momento que não vou compara-lo e assim vai
cq.where(cb.or(cb.equal(cotRoot.get("todosfornecedores3"), _pesquisa.getListaValorPesquisa().get(0)), cb.or(cb.isNull(cotRoot.get("fk_ger_grupofor3")),cb.equal(cotRoot.get("fk_ger_grupofor3"),_pesquisa.getListaValorPesquisa().get(1)))));



Corrigindo nesta linha é where inves de orderby
//Este where tambem tem que ser dinamico ora vai ser varios campos a serem comparados hora não ai queria passar somen

Responder

11/03/2013

Fernando Silva

Então pessoal consegui resolver, usando "createQuery" direto invés de ser na classe no "namedQuery":
Alem disso também passei via string os parâmetros mas complexos como data assim como o orderby.

conforme abaixo.

"SELECT new entidades.com.ComCotacao3(c.idcodigo3, c.descricao3, c.datainc3, c.prazolancamento3, c.status3, c.qtditens3) "+
" FROM ComCotacao3 c "
+ " WHERE c.todosfornecedores3 = :todosfornecedores3 or"
+ " (c.fk_ger_grupofor3 is null or c.fk_ger_grupofor3 = :fk_ger_grupofor3) "
+ " and (c.data >= "+stringData+")"
+ " ORDER BY "+stringOrderBy);
Responder

31/07/2013

José

Obrigado amigo por compartilhar a solução com a gente, sendo assim estou dando o tópico por concluído.
Responder