Como ordem por mais de um campo em Grails?
-
11-07-2019 - |
Pergunta
Existe uma maneira de obter uma lista ordenada por dois campos, dizer nomes primeiro e último?
Eu sei .listOrderByLastAndFirst
e .list(sort:'last, first')
não vai funcionar.
Solução
Esta solução antiga não funciona mais. Por favor, veja a resposta de mattlary abaixo
Você pode ter que escrever um localizador de costume em HQL ou utilizar os critérios Builder.
MyDomain.find("from Domain as d order by last,first desc")
ou
def c = MyDomain.createCriteria()
def results = c.list {
order("last,first", "desc")
}
Outras dicas
Hates_ resposta critérios não parecem trabalhar para mim; colocando "last,first"
a fim só fará exceções dizendo, "Property 'last,first' not found"
. Para fim em dois campos, você pode fazer o seguinte:
def c = MyDomain.createCriteria()
def results = c.list {
and{
order('last','desc')
order('first','desc')
}
}
Esta é antiga, mas me ajudou a encontrar uma solução adequada. A "mais limpa" exemplo de código usando withCriteria atalho:
def c = MyDomain.withCriteria {
and {
order('last', 'desc')
order('first', 'desc')
}
}
critérios de ordenação mais complicado, (testados em Grails 2.1.0)
def c = MyDomain.withCriteria {
property {
order('last', 'desc')
}
order('first', 'desc')
}
Classifica primeiro por MyDomain.property.last seguida por MyDomain.first
Esta consulta está a trabalhar com base em primeiro campo. Quando o primeiro campo está em branco, então ele está em curto pelo segundo campo.
order('last','desc')
order('first','desc')
Eu acho que um critério é a melhor aposta, mas você fez a coisa certa ao tentar um localizador de primeira. Ao recuperar objetos de domínio de GORM, a ordem certa para fazer a tentativa é:. Localizador dinâmico, critérios, HQL
Você pode fazer isso
def results=MyDomain.findAll([sort:"last",order:'desc'],[sort:"first",order:'desc']);
esta linha de código irá primeiro ordenar os resultados de classe de domínio "MyDomain" primeiro por último nome e, em seguida, por primeiro nome da pessoa.
MyDomain.findAll(sort: ['first': 'desc','last':'desc'])
trabalha com grails-datastore-gorm: 6.0.3
Se você estava ordenar listas no conteúdo de seus itens, você precisará implementar um comparador que teria alguns smarts para permitir a você decidir a ordem de classificação com base em várias propriedades.
Alguns exemplos de comparadores Groovy de estilo são mostrados aqui
No entanto, se a lista que você está classificando está sendo retornado de uma consulta de banco de dados, você seria melhor fora classificando-o usando um CrteriaQuery e tipos em que
I tem o mesmo problema. Desde a minha lista não é tão grande, eu uso tipo groovy, como eu quiser classificar em campos de domínio ligado: CalendarData -> atração
def listCalendar (Calendar calendar) {
respond CalendarData.where {
calendar == calendar
}.list().sort{ "$it.attraction.type?:' '$it.attraction.name" }
}