NamedQuery com Order by

4 respostas
D

Pessoal,

Estou fazendo uma consulta com NamedQuery e Order By que está me retornando o seguinte erro:

14:21:25 WARN [JDBCExceptionReporter] SQL Error: 1008, SQLState: S0001
14:21:25 ERROR [JDBCExceptionReporter] The SELECT item identified by the ORDER BY number 1 contains a variable as part of the expression identifying a column position. Variables are only allowed when ordering by an expression referencing a column name.
Hibernate: select tbletqweb0_.cvCodEtqWeb as cvCodEtq1_11_, tbletqweb0_.ccNomEtqWeb as ccNomEtq2_11_, tbletqweb0_.ccVarEtqWeb as ccVarEtq3_11_ from tblEtqWeb tbletqweb0_ where ?=? order by ?

@Entity @Table(name = "tblEtqWeb") @Cacheable @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY) @NamedQueries({ @NamedQuery(name = "etqWeb.where", query = "select t from TblEtqWeb t where ccVarEtqWeb = ?", hints = { @QueryHint(name = "org.hibernate.cacheable", value = "true") }), @NamedQuery(name = "etqWeb2.where", query = "select t from TblEtqWeb t where ? = ? order by ?", hints = { @QueryHint(name = "org.hibernate.cacheable", value = "true") }) }) public class TblEtqWeb implements Serializable, InterfaceValidaAtributo {

O erro acontece na NemedQuery “etqWeb2.where”, pelo que eu entendi, acontece porque estou passando o parametro “ccVarEtqWeb” e o hibernate está interpretando como uma célula da coluna, e não como a coluna toda…

É isso mesmo? Como posso resolver?

Chamada da NamedQuery:

DAO<TblEtqWeb> dao = new DAO<TblEtqWeb>(TblEtqWeb.class); List<TblEtqWeb> lista = dao.buscaQuery("etqWeb2.where", param1, param2, EtqWeb.nomOrd);

DAO:

@SuppressWarnings("unchecked") public List<T> buscaQuery(String select, String... param) { List<T> t; try { EntityManager em = new JPAUtil().getEntityManager(); Query query = em .createNamedQuery(select); int count = 1; for (String aux : param) { query.setParameter(count++, aux); } t = (List<T>) query.getResultList(); } catch (NoResultException e) { t = null; } return t; }

O erro só acontece com o “Order By”, sem ele funciona normal…

4 Respostas

V

Cara, acredito que seu problema esteja aqui:

o que vc codificou foi

select t from TblEtqWeb t where ccVarEtqWeb = ?

mas tem que ser assim:

select t from TblEtqWeb t where t.ccVarEtqWeb = ?

Faça a mesma alteracao nas outras NamedQueries.

OBS: nome bemmmm estranho para uma entidade, aconselho voce a refatorar as suas entities.

t+

D

Até o where ta certinho… Roda sem problemas…

O erro acontece no final, “order by ?”…

Para este caso eu resolvi deixando fixa, “order by ccVarEtqWeb”… Pórem queria deixá-la dinâmica, estou codando um update que depende disso…

PS.: Infelizmente não posso alterar os nomes… Sei que não está explicitando sua funcionabilidade mas… :cry:

V

Desculpe, meu comentario foi em relacao a “etqWeb.where” em vez de “etqWeb2.where” como voce precisava, mas de qualquer modo acredito que “etqWeb.where” esteja com o problema que descrevi. Em relacao a “etqWeb2.where” o simbolo " ? " eh para passagem dinamica de valores para o parametro…eu disse VALORES, pois ao implementarmos algo como

"select u from Usuario u where u.idade = ? order by u.nome"

a query ja foi definida estaticamente! Nao tem como implementar uma ordenacao dinamica tal como:

"select u from Usuario u where u.idade = ? order by ?"

pois os parametros de ordenacao (em nosso caso eh o nome do usuario) deve ser definido estaticamente, mas os valores recebidos pelo primeiro parametro (u.idade = ?) podem sim, ser alterados em tempo de execucao.

t+

E

deroldo, segundo o erro gerado

“Variables are only allowed when ordering by an expression referencing a column name”

o order by poder receber valores dinamicos apenas quando os mesmos são os nomes das colunas.

Até mais

Criado 11 de outubro de 2011
Ultima resposta 27 de out. de 2011
Respostas 4
Participantes 3