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.

Foi útil?

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" }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top