Jpql Заказ по пункту с параметром
-
26-09-2019 - |
Вопрос
Я пытаюсь написать запрос 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")));