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
私が間違っていることについて何か考えはありますか?ありがとう!
「ASC」または「DESC」をクエリパラメータにすることはできません。代わりに文字列連結を使用できます。
query = "SELECT c FROM item ORDER BY c.name " + sortOrder;
sortOrder
のコンテンツはASCまたはDESCのみであり、ユーザーから直接取得されたものではないことを検証する必要があります。
ここで名前付きクエリを使用する場合は、そのうちの2つが必要です(名前付きクエリは静的であり、@ Markで示されているようにパラメータとしてASCとDESCを使用することはできません)。
'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;
}
正しい方法は 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")));