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.

Était-ce utile?

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

Les

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" }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top