web-dev-qa-db-fra.com

Comment commander par plus d'un champ dans Grails?

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.

39
TheBrain

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")
}
8
Hates_

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')
    }
}
81
mattlary

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')
    }
}
9
Arnar B

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

5
chim

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')
4
Nakul

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.

3
maq

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.

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

fonctionne avec grails-datastore-gorm: 6.0.3

2
gerrit-hntschl

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.

0
j pimmel

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" }
}