Order by dinamico em JPQL
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.
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")
Fernando Silva
Curtidas 0
Respostas
Davi Costa
30/01/2013
Já pensou em usar criteria?
att Davi
att Davi
GOSTEI 0
Danilo Gomes
30/01/2013
Realmente, nesse caso faz muito mais sentido usar criteria.
Criterias têm como principal vantagem serem dinâmicas. Facilitaria bastante sua vida.
Criterias têm como principal vantagem serem dinâmicas. Facilitaria bastante sua vida.
GOSTEI 0
Fernando Silva
30/01/2013
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.
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)))));
GOSTEI 0
Fernando Silva
30/01/2013
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.
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
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
GOSTEI 0
Fernando Silva
30/01/2013
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.
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);
GOSTEI 0
José
30/01/2013
Obrigado amigo por compartilhar a solução com a gente, sendo assim estou dando o tópico por concluído.
GOSTEI 0