2017-09-25 2 views
0

J'ai un champ String nommé versionNumber qui contient un numéro de version avec ce style de chaîne: integer.integer.integer p.e. 4.4.4Grails Comparator Domaine

J'ai une requête HQL pour récupérer la valeur maximale de ce champ:

Class.executeQuery('select max(versionNumber) from Class')

Avec cette requête je ne reçois pas une valeur correcte, je reçois 4.4.1 > 4.21.3

Comment puis-je créer un comparateur pour cette colonne?

+0

Quels sont les fichiers dbms que vous utilisez? – Ivar

+1

J'utilise mysql @Ivar –

Répondre

2

Le point est de diviser le versionNumber en jetons et commander ces jetons:

Class.executeQuery(‘SELECT versionNumber FROM Class 
       ORDER BY 
       CAST(SUBSTRING(versionNumber, 1, LOCATE(‘.’, versionNumber) - 1) AS INTEGER), 
       CAST(SUBSTRING(versionNumber, LOCATE(‘.’, versionNumber) + 1, locate('.', versionNumber, locate('.', versionNumber) + 1) - locate('.', versionNumber) - 1) AS INTEGER 
       CAST(SUBSTRING(versionNumber, LOCATE('.', versionNumber, LOCATE(‘.’, versionNumber) + 1) + 1, LOCATE('.', versionNumber, LOCATE('.', versionNumber, LOCATE('.', versionNumber) + 1) + 1) - LOCATE('.', versionNumber, LOCATE('.', versionNumber) + 1) - 1) AS INTEGER) 
      ‘), [max: 1]) 

Il semble un peu laid, mais est-ce travail de manière optimale.

+0

Préférez cela une fois sur ma réponse. (aussi parce que ce n'est pas dbms dépendant) +1 – Ivar

1

Vous pouvez essayer d'utiliser une formule pour diviser les parties de version. Ensuite, vous pouvez commander par ces versions et obtenir le meilleur résultat.

class DomainWithVersion { 
    String version; 

    Integer versionMajor; 
    Integer versionMinor; 
    Integer versionBuild; 

    static mapping = { 
     // SUBSTRING_INDEX is a MySQL function 
     versionMajor(formula: 'SUBSTRING_INDEX(version, '.', 1)') 
     versionMinor(formula: 'SUBSTRING_INDEX(SUBSTRING_INDEX(version, '.', 2), '.', -1)') 
     versionBuild(formula: 'SUBSTRING_INDEX(version, '.', -1)') 
    } 
} 
DomainWithVersion.executeQuery('select versionNumber from DomainWithVersion dwv order by dwv.versionMajor, dwv.versionMinor, dwv.versionBuild', [], [max: 1])