Question

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!

Was it helpful?

Solution

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.

OTHER TIPS

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")));
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top