我有一個包含與此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 –