2009-08-20 65 views
8

我有以下查詢哪個id喜歡按「raceDate」和「raceNo」asc排序。我可以弄清楚如何按一個字段排序,但不是兩個,有什麼想法?在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

我覺得你的例子可以降低一點。 類Foo { 字符串名稱 INT年齡 } 然後問我怎麼使用GORM標準訂購首先由名稱,然後按年齡? – 2009-10-21 18:44:18

+0

[已經回答這裏] [1] [1]:http://stackoverflow.com/questions/326053/how-to-order-by-more-than-one-field-in-grails – havana59er 2012-02-07 00:12:06

回答

4

像這樣的東西應該工作:

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

這不起作用,並引發錯誤: 列「table.RaceNo」在ORDER BY子句中無效,因爲它不包含在聚合函數或GROUP BY子句中。 – catrapture 2009-08-21 01:50:50