2011-02-03 17 views
17

Stumped en este caso. En Grails parece que no se puede definir una ordenación predeterminada en múltiples columnas en mapeo de dominio a la static mapping = {sort 'prop1 desc, prop2 asc'}, o {sort ([prop1: 'desc', prop2: 'asc']) }. Solo la primera columna se clasifica, coja.Grails mapping ordenar en varios campos :: Groovy ordenar en varias entradas de mapa

De manera similar, al intentar ordenar Groovy una consulta de Grails findAllBy en varias columnas, la segunda ordenación anula la primera.

lista def = [[ROWNUM: 2, posición: 3], [ROWNUM: 1, posición: 2], [ROWNUM: 3, la posición: 1]]

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

Obviamente falta el bote en este último caso, el tipo groovy. He visto publicaciones sobre: ​​implementación comparable, pero buscando algo más conciso si es posible.

+0

Hay un viejo pero sin resolver la solicitud de esto: http://jira.grails.org/browse/GRAILS-5306 – GreenGiant

Respuesta

30

Aquí hay una solución Groovy. Todavía esencialmente implementando un Comparador.

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

que acaba de ver no ha sido probado en la consola: esto logrará lo mismo que HQL find ("de SomeDomain como s orden por rowNum asc, posición desc")? – virtualeyes

+0

Sabroso; -) confirmó que funciona; 1-liner está perfectamente bien. Sería bueno si pudiéramos hacerlo en el nivel de mapeo en griales, pero eso podría tener que esperar 1.4 y hibernación nueva. Gracias Peter! – virtualeyes

+1

Combinatino de nave espacial y operadores de Elvis lo hace súper limpio – wrschneider

0

Puede utilizar String.format si conoce la longitud máxima. Supuse máximo 10 Longitud:

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

Gracias, dejé Grails no mucho después de la publicación (Hace 4 años), podría ayudar a otros ;-) – virtualeyes

4

Gracias a la conexión desde greengiant, vemos que el tema se cierra tan fija como de la versión 2.3.

También hay código de ejemplo:

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

Se está trabajando para mí en 2.4.3

Cuestiones relacionadas