2009-07-31 2 views
3

Ich habe eine List-Methode, die HQL verwendet. Wie füge ich die Paging- und Sortierparameter zu dieser Abfrage hinzu?Grails: Hinzufügen von Sortieren und Paging zu einer benutzerdefinierten HQL-Abfrage

def list = { 
     def termList 
     log.info "Getting terms for product: $params.productId" 
     params.max = 10 
     def p = Product.get(params.productId) 
     if (p) { 
      log.info "Product found: $p.name" 
      termList = Term.executeQuery("select distinct t from Term as t join t.definitions def join def.definitionProducts dp where dp.product=?", 
       p) 

     } else { 
      log.info "No Product found" 
      termList = Term.list(params) 

     } 
     log.info "Terms found: $termList.size" 

     [ termInstanceList: termList, termInstanceTotal: termList.size] 
    } 

Antwort

2

Aus Dokumentation:

// mit Karte von benannten Parametern und Paginierung params mit (ab Version 0.5) Account.executeQuery („distinct A.Zahl wählen aus Konto ein, wo a.branch =: Zweig ", [Zweig: 'London', max: 10, Offset: 5]);

+0

Diese Antwort isn‘ t völlig richtig. Wie in den folgenden Antwortzuständen können Sie nicht mit executeQuery sortieren und sortieren. Siehe http://jira.codehaus.org/browse/GRAILS-1200. –

7

Ich stieß auf das gleiche Problem; Während Sie in den executeQuery-Parametern max und offset angeben können, werden Sortierung und Reihenfolge ignoriert. Um dies zum Laufen zu bringen, musste ich Sortierung und Reihenfolge in der HQL-Abfrage selbst angeben. Die daraus resultierende Abfrage sollte ungefähr so ​​aussehen:

"select distinct a.number from Account a where a.branch = :branch order by a.id asc" 

Zuerst in Ihren sortierbare Spalten müssen Sie die Eigenschaft Attribut ändern, um die Domäne zu verweisen Sie abfragen. Gehen Sie für "Konto a" folgendermaßen vor:

<g:sortableColumn property="a.id" title="Id"/> 

Als nächstes müssen Sie Ihre HQL-Abfrage ändern. Leider scheint es, dass Sie benannte Parameter in der order by-Klausel nicht verwenden können. Sie müssen dies also manuell tun. Es wäre wahrscheinlich eine gute Idee, params.order und params.sort zuerst zu desinfizieren.

"select distinct a.number from Account a where a.branch = :branch order by " + params.sort + " " params.order 

Dies funktionierte für mich, ich hoffe wirklich, es gibt einen besseren Weg da draußen.

+0

In HQL, ich denke, Sie müssen die Reihenfolge Klausel in der Abfrage enthalten. Ich denke, das Sortieren mit dem üblichen Sortierparameter funktioniert nicht. Max und Offset sollten für das Paging verwendet werden. Siehe Beispiele http://grails.asia/grails-tutorial-for-beginners-hql-queries – JavaDev

3

Seien Sie vorsichtig beim Hinzufügen nicht validierter Parameter zu einer SQL-Abfrage.

ich Validierung wie folgt aus:

params.sort = 
    params.sort in ['id','name'] ? params.sort:'name' 
params.order = 
    params.order in ['asc','desc'] ? params.order:'asc' 

Dann kann ich sicher die Parameter in meine SQL-Abfrage

String sql = """ 
    SELECT NEW MAP(c.id as id, c.name as name) FROM Customer c 
    WHERE c.partner.id = :id 
    ORDER BY c.$params.sort $params.order 
""".stripMargin() 

hinzufügen und schließlich die executeQuery laufen

def customers = Customer.executeQuery(
    sql, 
    [id:params.long('id')], 
    [max:params.long('max'),offset:params.long('offset')] 
) 
+1

Wenn Sie viele Parameter haben, können Sie den Parameter sort einfach überprüfen: 'params.sort = new Customer() .domainClass.persistentProperties * .name.contains (params.sort)? params.sort: 'Name'' – Cookalino

Verwandte Themen