2013-06-26 200 views
3

我使用休眠的標準來打造,Postgres的查詢創建DISTINCT休眠標準:如何在這種情況下

criteria.addOrder(Order.asc(property).ignoreCase()).setProjection(
          Projections.distinct(Projections.property("name"))); 

生成的SQL類似如下:

select DISTINCT name from table1 order by lower(name) asc; 

當這個SQL被執行給出下面的錯誤:

ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list 

我知道這是反對postgres規則的東西,但w如果我查看錯誤,我發現我們不應該使用任何函數按順序排列。如果它然後使用我們需要有兩個變通:

  1. 使用嵌套查詢如下:

    select name from (select distinct name from table1) as aliasname order by lower(name) asc;

  2. BY子句中使用較低的功能都選擇和秩序。

    select DISTINCT lower(name) from table1 order by lower(name) asc;

所以對於修復,我會選擇一個解決方案進入休眠側。如何創建一個標準,使我可以得到任何上述兩個sqls。

  • 如何創建條件來獲取嵌套select。

  • 如何從通過在順序中使用的功能必須在選擇適用的標準確保也

    • 是休眠或DB側(療法任何更好的解決方案,而無需使用硬編碼SQL,的createQuery()或HQL)。

感謝事先你suggetions。

+0

似乎與您之前的問題鬆散相關http://stackoverflow.com/q/16460070/398670。 –

+0

嗨克雷格,很好的連接。同意它與我之前的問題有關。我試圖通過使用lower()函數而不是我的custom_sort函數來簡化上下文。僅供參考,我已經通過重寫Order類的toString()來解決我之前提到的與調用自定義數據庫函數有關的問題。你有什麼建議來解決這個問題嗎?謝謝 – akhi

回答

1

我最近遇到了同樣的問題,並最終使用SQLProjection。我意識到這篇文章已經有幾年了,但是我還沒有發現任何其他的解決方案可以工作或者不需要用硬編碼sql重寫整個查詢,所以希望這可以幫助其他遇到這個問題的人問題。該解決方案仍然需要一些硬編碼的sql,但它很少。

String[] columnAlias = {"name"}; 
criteria.addOrder(Order.asc("name").ignoreCase()).setProjection(Projections.distinct(
Projections.sqlProjection("lower(" + criteria.alias + "_.name) as name", columnAlias, 
Hibernate.STRING as Type[]))); 

這應該生成以下SQL:

select distinct lower(this_.name) as name from table1 this_ order by lower(this_.name) asc; 

注:除非另有說明,criteria.alias被默認設置爲 '本'。