2011-02-12 23 views
3

我使用的建設,「如果」,在HSQL:使用在建工程在休眠

String q = "SELECT id, name, " + 
       "IF (ABS(name) > 0, LPAD(ABS(name), 4, '0'), name) AS tord " + 
       "FROM table where city= " + cityId + " order by tord"; 

    Query query = session.createSQLQuery(q); 
    List<Object[]> list = query.list(); 
    session.getTransaction().commit(); 
    session.close(); 

,現在我想重構這段代碼用HQL。我怎樣才能做到這一點? 謝謝。

回答

9

選項1.

更換IF與CASE:

(case when ABS(name) > 0 then LPAD(ABS(name), 4, '0' else name end) AS tord 

詳見HQL documentation

選項2

HQL支持本機的功能。如果封裝在自定義的SQL函數的計算,你可以寫這樣的:

select t.*, paddNumber(t.name, 4) as tord from TableEntity t 
where t.city = :city order by tord 

有沒有環境檢查,但認爲每個結果記錄將被表示爲對象[]。第一個元素將包含您的實體,第二個元素包含tord。

選項3

如果可能,改寫應用程序邏輯。在保存記錄之前,可以通過不同的方法在字段'名稱'中添加所需的填充。這將在排序過程中刪除不必要的數據庫計算。