2010-09-01 13 views
16

Ich versuche, eine JPQL Abfrage mit einer ORDER BY-Klausel zu schreiben:JPQL ORDER BY-Klausel mit dem Parameter

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

Ich mag würde einen „Ordnung“ Parameter setzen, dessen Wert würde entweder „ASC“ sein oder "DESC":

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

und dann in meiner Implementierung:

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

Dies ist, wenn ich einen Hibernate Fehler:

org.hibernate.HibernateException: Errors in named queries 

Irgendeine Idee auf, was ich falsch mache? Vielen Dank!

Antwort

17

Der "ASC" oder "DESC" kann kein Abfrageparameter sein. Sie könnten stattdessen String-Verkettung verwenden.

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

sollten Sie überprüfen, ob der Inhalt von sortOrder nur ASC oder DESC sein kann, und kommt nicht direkt von dem Benutzer.

+1

OK, die viel erklärt. Gibt es trotzdem eine String-Verkettung in der Deklaration einer @namedQuery? –

+0

in Ordnung, danke trotzdem! –

7

Wenn Sie hier benannte Abfragen verwenden möchten, benötigen Sie zwei davon (benannte Abfragen sind statisch und Sie können ASC und DESC nicht als Parameter verwenden, wie von @Mark angegeben).

+0

Oder ich denke, ich könnte nur eine dynamische Abfrage verwenden? –

+0

@Pedro Sicher. Aber das ist keine @NamedQuery (ich habe tatsächlich einen deiner Kommentare beantwortet). –

+0

Sie haben Recht. Aber die Wahrheit ist, ich habe ziemlich viele benannte Abfragen, die sortiert werden müssen, so dass das Erstellen von 2 Abfragen für jede doppelt so viele benannte Abfragen ergibt. Ist das ein Problem? Oder sollte ich stattdessen dynamische Abfragen verwenden? –

5

Statt zu schreiben zweimal benannte Abfrage eine ‚Ordnung durch‘ Klausel enthält, 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; 
} 
+6

Dies trifft möglicherweise nicht zu, wenn die 'Paginierung' zum Einsatz kommt. –

+1

Nur eine Anmerkung zu sagen, dass es immer besser ist, in der Datenbank als in Code zu sortieren, wo es möglich ist. – karol