Предложение JPQL ORDER BY с параметром - PullRequest
16 голосов
/ 01 сентября 2010

Я пытаюсь написать JPQL-запрос с предложением ORDER BY:

query = "SELECT c FROM item ORDER BY c.name ASC"

Я хотел бы установить параметр "order", значение которого будет "ASC" или "DESC":

query = "SELECT c FROM item ORDER BY c.name :order"

А потом в моей реализации:

query.setParameter("order", "ASC");

Это когда я получаю ошибку Hibernate:

org.hibernate.HibernateException: Errors in named queries

Любая идея о том, что яделать неправильно?Спасибо!

Ответы [ 4 ]

18 голосов
/ 01 сентября 2010

«ASC» или «DESC» не может быть параметром запроса.Вместо этого вы можете использовать конкатенацию строк.

query = "SELECT c FROM item ORDER BY c.name " + sortOrder;

Вы должны проверить, что содержимое sortOrder может быть только ASC или DESC и не приходит непосредственно от пользователя.

7 голосов
/ 01 сентября 2010

Если вы хотите использовать именованные запросы здесь, вам понадобятся два из них (именованные запросы являются статическими, и вы не можете использовать ASC и DESC в качестве параметра, как указано @Mark).

5 голосов
/ 09 ноября 2011

Вместо того, чтобы дважды писать именованный Запрос, содержащий предложение order by, вы можете реализовать свой DAO следующим образом:

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;
}
0 голосов
/ 05 марта 2019

Я полагаю, правильный путь - использование ORDER BY предложения Criteria API

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")));
...