Pedido JPQL por cláusula com parâmetro
-
26-09-2019 - |
Pergunta
Estou tentando escrever uma consulta JPQL com um pedido por cláusula:
query = "SELECT c FROM item ORDER BY c.name ASC"
Eu gostaria de definir um parâmetro "Order", cujo valor seria "ASC" ou "Desc":
query = "SELECT c FROM item ORDER BY c.name :order"
E então na minha implementação:
query.setParameter("order", "ASC");
É quando recebo um erro de hibernação:
org.hibernate.HibernateException: Errors in named queries
Alguma ideia do que estou fazendo de errado? Obrigado!
Solução
O "ASC" ou "DEC" não pode ser um parâmetro de consulta. Você pode usar a concatenação da string.
query = "SELECT c FROM item ORDER BY c.name " + sortOrder;
Você deve validar que o conteúdo de sortOrder
Só pode ser ASC ou DESC e não vem diretamente do usuário.
Outras dicas
Se você deseja usar as consultas nomeadas aqui, precisará de duas delas (as consultas nomeadas são estáticas e você não pode usar ASC e DESC como parâmetro, conforme apontado por @Mark).
Em vez de escrever duas vezes uma consulta nomeada contendo uma cláusula 'Order by', você pode implementar seu DAO desta maneira:
public List<MyEntity> findByAttribute(boolean desc,...){
TypedQuery<MyEntity> q = em.createNamedQuery(...
q.setParameter(...
List<MyEntity> result = q.getResultList();
if(desc){
Collections.reverse(result );
}
return result;
}
Suponho que o caminho certo está usando Ordem por cláusula de API de critérios
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Country> q = cb.createQuery(Country.class);
Root<Country> c = q.from(Country.class);
q.select(c);
q.orderBy(cb.asc(c.get("currency")), cb.desc(c.get("population")));