2009-08-20 10 views
8

Ich habe die folgende Abfrage, die ID gerne von "raceDate" und von "RaceNo" asc. Ich kann herausfinden, wie man nach einem Feld sortiert, aber nicht nach zwei, irgendwelchen Ideen?Sortieren nach mehreren Feldern mit Kriterien in Grails

def list = { 
     params.max = Math.min(params.max ? params.max.toInteger() : 20, 100) 
     params.offset = params?.offset?.toInteger() ?: 0 
     params.sort = "raceDate" 
     params.order = params?.order ?: "asc" 

     def results = Race.createCriteria().list(
       max: params.max, 
       offset: params.offset, 
       sort: params.sort, 
       order: params.order 
       ) { 
      and { 
       if (params.raceNo && params.raceNo != '') 
        eq("raceNo", params.raceNo.toInteger()) 
       if (params.country && params.country != '') 
        eq("country", params.country) 
       if (params.venue && params.venue != '') 
        eq("venue", params.venue) 
       if (params.raceType && params.raceType != '') 
        eq("raceType", params.raceType) 
       if (params.surface && params.surface != '') 
        eq("surface", params.surface) 
       if (params.officialGoing && params.officialGoing != '') 
        eq("officialGoing", params.officialGoing) 

       if (params.raceDateStart_year && params.raceDateStart_month && params.raceDateStart_day 
         && params.raceDateEnd_year && params.raceDateEnd_month && params.raceDateEnd_day) { 
        String startInput = "${params.raceDateStart_year}/${params.raceDateStart_month}/${params.raceDateStart_day}" 
        Date startDate = jodaFormatter.parseDateTime(startInput).toDate(); 
        String endInput = "${params.raceDateEnd_year}/${params.raceDateEnd_month}/${params.raceDateEnd_day}" 
        Date endDate = jodaFormatter.parseDateTime(endInput).toDate(); 

        between("raceDate", startDate, endDate) 
       } 
      } 
     } 

     [ raceInstanceList:results, raceInstanceTotal:results.totalCount, params:params ] 
} 
+0

Ich denke, Ihr Beispiel ein wenig geschnitten werden kann. Foo Klasse { String name int Alter } Dann fragen, wie verwende ich GORM Kriterien nach Namen zuerst zu bestellen, dann mit dem Alter? –

+0

[bereits beantwortet hier] [1] [1]: http://stackoverflow.com/questions/326053/how-to-order-by-more-than-one-field-in-grails – havana59er

Antwort

4

So etwas sollte funktionieren:

def results = Race.createCriteria().list(
       max: params.max, 
       offset: params.offset, 
       sort: params.sort, 
       ) { 
       order('raceDate', 'asc') 
       order('raceNo', 'asc') 
       and { 
        if (params.raceNo && params.raceNo != '') 
         eq("raceNo", params.raceNo.toInteger()) 
       ... 
+1

Das funktioniert nicht und gibt den Fehler aus: Die Spalte "table.RaceNo" ist in der ORDER BY-Klausel ungültig, da es weder in einer Aggregatfunktion noch in der GROUP BY-Klausel enthalten ist. – catrapture