Pregunta

¿Hay alguna manera de obtener una lista ordenada por dos campos, decir apellido y nombre?

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

¿Fue útil?

Solución

Esta antigua solución ya no funciona. Consulte la respuesta de Mattlary a continuación

Puede que tenga que escribir un buscador personalizado en HQL o utilizar el Creador 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")
}

Otros consejos

La respuesta del criterio Hates_ no parecía funcionar para mí; poner " last, first " en orden solo provocará excepciones que digan, " Propiedad 'last, first' no encontrada " . Para ordenar en dos campos, puede hacer lo siguiente:

def c = MyDomain.createCriteria()
def results = c.list {
    and{
       order('last','desc')
       order('first','desc')
    }
}

Esto es bastante antiguo pero me ayudó a encontrar una solución adecuada. Un limpiador ejemplo de código mediante el uso del atajo Criteria:

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

Criterios de pedido más complicados (probados en Grails 2.1.0)

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

ordena primero por MyDomain.property.last luego por MyDomain.first

Esta consulta funciona sobre la base del primer campo. Cuando el primer campo está en blanco, el segundo campo lo acorta.

order('last','desc')
order('first','desc')

Creo que un criterio es la mejor apuesta, pero hiciste lo correcto al intentar un buscador primero. Al recuperar objetos de dominio de GORM, el orden correcto para hacer el intento es: buscador dinámico, criterios, HQL.

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 apellido y luego por nombre de la persona.

MyDomain.findAll(sort: ['first': 'desc','last':'desc'])

funciona con grails-datastore-gorm: 6.0.3

Si estuviera ordenando listas por el contenido de sus elementos, necesitaría implementar un comparador que tuviera algunos conocimientos que le permitieran decidir el orden de clasificación basado en múltiples propiedades.

Se muestran algunos ejemplos de comparadores de estilo Groovy aquí

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

Tengo el mismo problema. Como mi lista no es tan grande, utilizo una ordenación maravillosa, ya que quiero ordenar en campos de dominio vinculado: CalendarData - > Atracción

def listCalendar (Calendar calendar) {
    respond CalendarData.where {
        calendar == calendar
    }.list().sort{ "$it.attraction.type?:' '$it.attraction.name" }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top