Вопрос

Я пытаюсь написать запрос JPQL с помощью пункта по заказу:

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

Я хотел бы установить параметр «Заказ», значение которого будет либо «ASC», либо «Desc»:

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

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

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

Это когда я получаю ошибку гибернации:

org.hibernate.HibernateException: Errors in named queries

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

Это было полезно?

Решение

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

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

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

Другие советы

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

Вместо того, чтобы написать дважды именованный запрос, содержащий предложение «Заказ», вы можете реализовать свой 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;
}

Я полагаю, правильно использует Заказ по пункту критериев 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")));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top