I'm trying to write a JPQL Query with an ORDER BY clause:
query = "SELECT c FROM item ORDER BY c.name ASC"
I would like to set an "order" parameter, whose value would be either "ASC" or "DESC":
query = "SELECT c FROM item ORDER BY c.name :order"
And then in my implementation:
query.setParameter("order", "ASC");
This is when I get an Hibernate error:
org.hibernate.HibernateException: Errors in named queries
Any idea on what I'm doing wrong? Thanks!
The "ASC" or "DESC" can't be a query parameter. You could use string concatenation instead.
query = "SELECT c FROM item ORDER BY c.name " + sortOrder;
You should validate that the contents of sortOrder
can only be ASC or DESC and does not come directly from the user.
If you want to use named queries here, you'd need two of them (named queries are static and you can't use ASC and DESC as parameter as pointed out by @Mark).
Instead of writing twice a named Query containing an 'order by' clause, you can implement your DAO this way :
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;
}
I suppose right way is using ORDER BY clause of 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")));