JPQL ORDER BY-Klausel mit dem Parameter
-
26-09-2019 - |
Frage
Ich versuche, eine JPQL Abfrage mit einer ORDER BY-Klausel zu schreiben:
query = "SELECT c FROM item ORDER BY c.name ASC"
würde Ich mag eine „Ordnung“ Parameter setzen, deren Wert würde entweder „ASC“ oder „DESC“ sein:
query = "SELECT c FROM item ORDER BY c.name :order"
Und dann in meiner Implementierung:
query.setParameter("order", "ASC");
Dies ist, wenn ich ein Hibernate-Fehler:
org.hibernate.HibernateException: Errors in named queries
Jede Idee, was ich falsch mache? Dank!
Lösung
Die „ASC“ oder „DESC“ kann kein Abfrageparameter sein. Sie könnten stattdessen String-Verkettung verwenden.
query = "SELECT c FROM item ORDER BY c.name " + sortOrder;
Sie sollten bestätigen, dass der Inhalt von sortOrder
nur ASC oder DESC sein kann, und kommt nicht direkt von dem Benutzer.
Andere Tipps
Wenn Sie hier benannten Abfragen verwenden möchten, sollten Sie zwei von ihnen benötigen (benannten Abfragen sind statisch und Sie können nicht ASC und DESC als Parameter Wie von @ Mark verwenden).
Statt des Schreibens zweimal eine benannte Abfrage ein ‚order by‘ -Klausel enthalten, können Sie Ihre DAO auf diese Weise implementieren:
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;
}
nehme ich richtig verwendet ORDER BY-Klausel von 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")));