Ordenação consulta GORM LIST
06/09/2016 11:03
0
Bom dia!

Possuo uma tabela com um campo código do tipo VARCHAR preenchido com os valores: 
[list][/list]Quando realizo o list -> Domain.list(sort: "codigo", order:"asc")  a consulta retorna os registros na ordem incorreta, considerando, por exemplo, o registro "1.10" a frente do "1.1.1".
Alguem consegue me ajudar ? será que existe uma forma do GORM ordenar corretamente ou terei que partir para um executeQuery, ou a própria classe groovy.sql.Sql
Observação: o banco de dados é postgreSQL

Desde já agradeço qualquer ajuda.
Tags: Grails, list, postgre, gorm, find, executeQuery, groovy, sql, ordenacao, sort, order


0
Não aprendi a mexer corretamente no fórum, mas percebi que a lista com os valores ficou errada.
Correção: Possuo uma tabela com um campo código do tipo VARCHAR preenchido com os valores: "1", "1.1", "1.1.1", "1.10", etc...
06/09/2016 11:05


0
Rayldo,

Eu acho que isso não chega a ser uma limitação do GORM e mesmo se você fizesse em SQL ou numa planilha de Excel chegaria no mesmo "problema" com a classificação dessas strings.

Basicamente você tem uma tabela com esses códigos, mas os elementos não estão "aninhados", certo? Tipos.. cada elemento 1.1, 1.2, 1.3 não sabe que é filho do 1... apenas tem esse campo "código" fazendo esse papel?
06/09/2016 13:37


0
Oi Rafael,

A tabela tem um auto relacionamento sim. O 1.1 sabe que é filho do 1. A questão é que da mesma forma que o 1.1 é filho do 1, tem o 1.10 também filho do 1, então na ordenação o resultado vem desordenado.
06/09/2016 14:07


0
Rayldo, 

A questão é por que o seu campo é varchar dai é como se o sql só considerasse o primeiro caractere e o restante dos caracteres para ele não importa mais para a ordenação.

Não sei se consegui te ajudar , mas foi o que já aconteceu comigo.
06/09/2016 15:34


0
Olá Rayldo.

A questão está no código ASCII destes caracteres.

Veja, o código de '.' é Dec (46)
O código de '1' é Dec (49)
O código de '0' é Dec (48)

Assim teríamos

1.10 =>   | 49 | 46 | 49 | 48 |
1.1.1 =>  | 49 | 46 | 49 | 46 | 49

Veja que o desempate aqui vai se dar na posição 4, pois as posições anteriores têm os mesmos códigos. Então temos 48 e 46.
Se você estiver ordenando de forma ascendente 46 vem primeiro, de forma que 1.1.1 vai aparecer primeiro, se for descendente 1.10 será o primeiro.

Faça o teste em uma planilha Excel que verá este mesmo resultado.

Abraço!
06/09/2016 20:20



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto