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!

Foi útil?

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")));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top