2017-09-25 93 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])