2009-08-20 13 views
8

J'ai la requête suivante que je voudrais trier par "raceDate" et par "raceNo" asc. Je peux comprendre comment trier par un domaine, mais pas par deux, des idées?Tri sur plusieurs champs avec des critères dans 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

Je pense que votre exemple pourrait être coupé un peu. class Foo {String name Âge int } Ensuite, demandez, comment puis-je utiliser des critères GORM pour commander d'abord par nom, puis par l'âge? –

+0

[déjà répondu ici] [1] [1]: http://stackoverflow.com/questions/326053/how-to-order-by-more-than-one-field-in-grails – havana59er

Répondre

4

Quelque chose comme cela devrait fonctionner:

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

Cela ne fonctionne pas et génère l'erreur: La colonne "table.RaceNo" n'est pas valide dans la clause ORDER BY car elle n'est contenue ni dans une fonction d'agrégat ni dans la clause GROUP BY. – catrapture