Comment commander par plus d'un champ dans Grails?
-
11-07-2019 - |
Question
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 (sorte: 'dernier, premier')
ne fonctionnera pas.
La solution
Cette ancienne solution ne fonctionne plus. Voir la réponse de Mattlary ci-dessous
Vous devrez peut-être écrire un chercheur 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")
}
Autres conseils
réponses aux critères de Hates_ ne semblaient pas fonctionner pour moi; La mise en ordre de "dernier, premier" et "
" ne provoquera que des exceptions indiquant, "Propriété" dernier, premier "non trouvé"
. 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 " nettoyeur " exemple de code en utilisant le raccourci withCriteria:
def c = MyDomain.withCriteria {
and {
order('last', 'desc')
order('first', 'desc')
}
}
Critères de commande plus complexes (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 second.
order('last','desc')
order('first','desc')
Je pense qu'un critère est le meilleur choix, mais vous avez fait le bon choix en essayant d'abord de trouver un chercheur. Lors de la récupération d'objets de domaine depuis GORM, l'ordre correct pour effectuer cette tentative est le suivant: chercheur dynamique, critères, HQL.
vous pouvez le faire
def results=MyDomain.findAll([sort:"last",order:'desc'],[sort:"first",order:'desc']);
cette ligne de code va d'abord trier les résultats de la classe de domaine "MonDomaine". d'abord par nom de famille, puis par prénom de la personne.
MyDomain.findAll(sort: ['first': 'desc','last':'desc'])
fonctionne avec grails-datastore-gorm: 6.0.3
Si vous triiez des listes en fonction du contenu de leurs éléments, vous auriez besoin d’un compilateur doté de capacités intelligentes vous permettant de choisir l’ordre de tri en fonction de plusieurs propriétés.
Des exemples de comparateurs de style Groovy sont présentés ici
Toutefois, 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
.J'ai le même problème. Comme ma liste n’est pas si longue, j’utilise le 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" }
}