NamedQuery com Order by

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…

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+

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:

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+

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