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!

War es hilfreich?

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")));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top