2011-02-03 16 views
17

Stumped on this one. In Grails sembra che non sia possibile definire un ordinamento predefinito su più colonne nel mapping del dominio a la static mapping = {sort 'prop1 desc, prop2 asc'} o {sort ([prop1: 'desc', prop2: 'asc'])) }. Solo la prima colonna viene ordinata, zoppa.Ordinamento di Grails su più campi :: Ordinamento di Groovy su più voci della mappa

Analogamente, quando si tenta di ordinare Groovy una query findAllBy di Grails su più colonne, il secondo ordinamento sovrascrive il primo.

lista def = [[ROWNUM: 2, Esposizione: 3], [rownum: 1, la posizione: 2], [rownum: 3, Esposizione: 1]]

list.sort {} it.rowNum .sort {it.position}

Ovviamente manca la barca su quest'ultimo caso, il tipo groovy. Ho visto postings: implementazione comparabile, ma cercando qualcosa di più conciso se possibile.

+0

C'è un vecchio, ma non risolto richiesta di questo: http://jira.grails.org/browse/GRAILS-5306 – GreenGiant

risposta

30

Ecco una soluzione Groovy. Ancora essenzialmente implementando un Comparatore però.

list.sort { map1, map2 -> map1.rowNum <=> map2.rowNum ?: map1.position <=> map2.position } 
+1

appena visto non sono stati testati in console - questo otterrà lo stesso risultato di HQL ("da SomeDomain come ordine per rigaNum asc, posizione desc")? – virtualeyes

+0

Tasty; -) ha confermato che funziona; 1-liner è perfettamente a posto. Sarebbe bello se potessimo farlo a livello di mappatura in Grails, ma potrebbe dover aspettare 1.4 e il nuovo ibernazione. Grazie Peter! – virtualeyes

+1

Combinatino di navicella spaziale e gli operatori di Elvis lo rendono super-pulito – wrschneider

0

È possibile utilizzare String.format se si conosce la lunghezza massima. Ho assunto max 10 Lunghezza:

list.sort { String.format('%010d%010d', it.rowNum, it.position) } 
+0

Grazie, ho lasciato Grails non molto dopo la pubblicazione (4 anni fa), potrebbe aiutare gli altri però ;-) – virtualeyes

4

Grazie al collegamento da GreenGiant, vediamo che il problema è chiuso come fisso a partire dalla versione 2.3.

C'è anche codice di esempio:

static mapping = 
    { sort([lastname:'asc', name:'asc']) } 

Si sta lavorando per me in 2.4.3

Problemi correlati