开发者

JPQL ORDER BY clause with parameter

开发者 https://www.devze.com 2023-01-14 14:57 出处:网络
I\'m trying to write a JPQL Query with an ORDER BY clause: query = \"SEL开发者_C百科ECT c FROM item ORDER BY c.name ASC\"

I'm trying to write a JPQL Query with an ORDER BY clause:

query = "SEL开发者_C百科ECT 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")));
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号