我有一个包含与此String风格版本号命名为versionNumber
一个字符串字段:integer.integer.integer p.e. 4.4.4
Grails领域比较
我对检索该字段的最大值的HQL查询:
Class.executeQuery('select max(versionNumber) from Class')
使用该查询我没有得到正确的值,我得到4.4.1 > 4.21.3
如何为此列创建比较器?
我有一个包含与此String风格版本号命名为versionNumber
一个字符串字段:integer.integer.integer p.e. 4.4.4
Grails领域比较
我对检索该字段的最大值的HQL查询:
Class.executeQuery('select max(versionNumber) from Class')
使用该查询我没有得到正确的值,我得到4.4.1 > 4.21.3
如何为此列创建比较器?
的一点是对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])
它看起来有点丑陋,但它确实在工作最佳的方式。
在我的回答中选择一次。 (也因为它不依赖于dbms)+1 – Ivar
您可以尝试使用公式来分割版本部分。然后你可以通过这些版本进行订购并获得最佳结果。
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])
你使用的是什么dbms? – Ivar
我使用mysql @Ivar –