web-dev-qa-db-ja.com

パラメータ付きのJPQLORDERBY句

ORDERBY句を使用してJPQLクエリを作成しようとしています。

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

「order」パラメーターを設定したいと思います。その値は「ASC」または「DESC」のいずれかになります。

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

そして私の実装では:

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

これは、Hibernateエラーが発生したときです。

org.hibernate.HibernateException: Errors in named queries

私が間違っていることについて何か考えはありますか?ありがとう!

16
Pierre Duplouy

「ASC」または「DESC」をクエリパラメータにすることはできません。代わりに文字列連結を使用できます。

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

sortOrderのコンテンツはASCまたはDESCのみであり、ユーザーから直接取得されたものではないことを検証する必要があります。

18
Mark Byers

ここで名前付きクエリを使用する場合は、そのうちの2つが必要です(名前付きクエリは静的であり、@ Markで示されているようにパラメータとしてASCとDESCを使用することはできません)。

7
Pascal Thivent

'order by'句を含む名前付きクエリを2回記述する代わりに、次の方法で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;
}
5
skay

正しい方法は CriteriaAPIのORDERBY句 を使用していると思います

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")));
1
Grigory Kislin