Grails Domain Comparator

时间:2017-09-25 11:16:54

标签: grails groovy

我有一个名为versionNumber的字符串字段,其中包含具有此字符串样式的版本号:integer.integer.integer p.e. 4.4.4

我有一个HQL查询用于检索此字段的最大值:

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

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

如何为此列创建比较器?

2 个答案:

答案 0 :(得分: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])

它看起来有点难看,但它以最佳方式工作。

答案 1 :(得分: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])