Cómo ordenar por más de un campo en Grails?


¿Hay alguna manera de obtener una lista ordenada por dos campos, por ejemplo, apellidos y nombres?

Sé que .listOrderByLastAndFirst y .list(sort:'last, first') no funcionará.

Author: Adeel Ansari, 2008-11-28

10 answers

Esta vieja solución ya no funciona. Por favor, consulte la respuesta de mattlary a continuación

Es posible que tenga que escribir un finder personalizado en HQL o usar el Generador de criterios.

MyDomain.find("from Domain as d order by last,first desc")

O

def c = MyDomain.createCriteria()
def results = c.list {
       order("last,first", "desc")
}
 8
Author: Hates_,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-12 04:55:45

La respuesta a los criterios Hates_ no parecía funcionar para mí; poner "last,first" en orden solo causará excepciones diciendo, "Property 'last,first' not found". Para ordenar en dos campos, puede hacer lo siguiente:

def c = MyDomain.createCriteria()
def results = c.list {
    and{
       order('last','desc')
       order('first','desc')
    }
}
 80
Author: mattlary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-16 13:48:51

Esto es bastante antiguo, pero me ayudó a encontrar una solución adecuada. Un ejemplo de código "cleaner" usando el atajo withCriteria:

def c = MyDomain.withCriteria {
    and {
        order('last', 'desc')
        order('first', 'desc')
    }
}
 9
Author: Arnar B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-02 00:45:44

Criterios de ordenación más complicados, (probado en Grails 2.1.0)

def c = MyDomain.withCriteria {
    property {
        order('last', 'desc')
    }
    order('first', 'desc')
}

Ordena primero por Mi dominio.propiedad.por último, por mi dominio.primero

 5
Author: chim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-12 12:37:57

Esta consulta está trabajando sobre la base del primer campo. Cuando el primer campo está en blanco, entonces es cortocircuitado por el segundo campo.

order('last','desc')
order('first','desc')
 4
Author: Nakul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-03 00:37:23

Creo que un criterio es la mejor apuesta, pero hiciste lo correcto al intentar un finder primero. Al recuperar objetos de dominio de GORM, el orden correcto para realizar el intento es: dynamic finder, criteria, HQL.

 3
Author: Matthew Taylor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-30 13:33:21

Puedes hacer esto

def results=MyDomain.findAll([sort:"last",order:'desc'],[sort:"first",order:'desc']);

Esta línea de código primero ordenará los resultados de la clase de dominio "MyDomain" primero por el apellido y luego por el nombre de la persona .

 3
Author: maq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-29 05:38:25
MyDomain.findAll(sort: ['first': 'desc','last':'desc'])

Funciona con grails-datastore-gorm: 6.0.3

 2
Author: gerrit-hntschl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-04 11:39:20

Si estuviera ordenando listas sobre el contenido de sus elementos, tendría que implementar un comparador que tendría algunas inteligencias para permitirle decidir el orden de clasificación basado en múltiples propiedades.

Algunos ejemplos de comparadores de estilo Groovy se muestran aquí

Sin embargo, si la lista que está ordenando se devuelve de una consulta de base de datos, sería mejor ordenarla usando una CrteriaQuery y ordenarla

 0
Author: j pimmel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-28 16:17:18

Tengo el mismo problema. Dado que mi lista no es tan grande, uso groovy sort, ya que quiero ordenar los campos del dominio vinculado: CalendarData - > Atracción

def listCalendar (Calendar calendar) {
    respond CalendarData.where {
        calendar == calendar
    }.list().sort{ "$it.attraction.type?:' '$it.attraction.name" }
}
 0
Author: Philippe Rostaing-Tayard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-05 15:13:48