2017-09-25 113 views
0

我有一个包含与此String风格版本号命名为versionNumber一个字符串字段:integer.integer.integer p.e. 4.4.4Grails领域比较

我对检索该字段的最大值的HQL查询:

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

使用该查询我没有得到正确的值,我得到4.4.1 > 4.21.3

如何为此列创建比较器?

+0

你使用的是什么dbms? – Ivar

+1

我使用mysql @Ivar –

回答

2

的一点是对VERSIONNUMBER分成标记和订购这些令牌:

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]) 

它看起来有点丑陋,但它确实在工作最佳的方式。

+0

在我的回答中选择一次。 (也因为它不依赖于dbms)+1 – Ivar

1

您可以尝试使用公式来分割版本部分。然后你可以通过这些版本进行订购并获得最佳结果。

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])