Existe-t-il un moyen d'obtenir une liste classée par deux champs, par exemple le nom et le prénom?
Je sais que .listOrderByLastAndFirst
et .list(sort:'last, first')
ne fonctionneront pas.
Cette ancienne solution ne fonctionne plus. S'il vous plaît voir la réponse de Mattlary ci-dessous
Vous devrez peut-être écrire un Finder personnalisé dans HQL ou utiliser le générateur de critères.
MyDomain.find("from Domain as d order by last,first desc")
Ou
def c = MyDomain.createCriteria()
def results = c.list {
order("last,first", "desc")
}
Hates_ critère de réponse n'a pas semblé fonctionner pour moi; mettre "last,first"
dans l'ordre provoquera seulement des exceptions disant, "Property 'last,first' not found"
. Pour commander sur deux champs, vous pouvez procéder comme suit:
def c = MyDomain.createCriteria()
def results = c.list {
and{
order('last','desc')
order('first','desc')
}
}
C'est assez vieux mais m'a aidé à trouver une solution appropriée. Un exemple de code "plus propre" en utilisant le raccourci withCriteria:
def c = MyDomain.withCriteria {
and {
order('last', 'desc')
order('first', 'desc')
}
}
Critères de commande plus compliqués (testé dans Grails 2.1.0)
def c = MyDomain.withCriteria {
property {
order('last', 'desc')
}
order('first', 'desc')
}
trie d'abord par MyDomain.property.last puis par MyDomain.first
Cette requête fonctionne sur la base du premier champ. Lorsque le premier champ est vide, il est raccourci par le deuxième champ.
order('last','desc')
order('first','desc')
tu peux le faire
def results=MyDomain.findAll([sort:"last",order:'desc'],[sort:"first",order:'desc']);
cette ligne de code triera d’abord les résultats de la classe de domaine "MyDomain" d’abord par nom de famille, puis par prénom de la personne.
Je pense qu’un critère est le meilleur choix, mais vous avez fait le bon choix en essayant d’abord un Finder. Lors de la récupération d'objets de domaine à partir de GORM, l'ordre correct pour effectuer cette tentative est le suivant: recherche dynamique, critères, HQL.
MyDomain.findAll(sort: ['first': 'desc','last':'desc'])
fonctionne avec grails-datastore-gorm: 6.0.3
Si vous triiez des listes sur le contenu de leurs éléments, vous auriez besoin d'un implémenteur doté de capacités de contrôle permettant de décider de l'ordre de tri en fonction de plusieurs propriétés.
Quelques exemples de comparateurs de style Groovy sont montrés ici
Cependant, si la liste que vous triez est renvoyée à partir d'une requête de base de données, il serait préférable de la trier à l'aide de CrteriaQuery et d'effectuer un tri sur cette requête.
J'ai le même problème… .. Comme ma liste n'est pas si longue, j'utilise un tri groovy, car je veux trier les champs du domaine lié: CalendarData -> Attraction
def listCalendar (Calendar calendar) {
respond CalendarData.where {
calendar == calendar
}.list().sort{ "$it.attraction.type?:' '$it.attraction.name" }
}