2012-04-16 93 views
2

我想使用Gorm檢索最近的10個地理定位對象。 爲此,我想自定義order()參數,以便使用sql函數的get_distance(longitude,latitude,:longitude,:緯度)。 我一直在爲這一整天掙扎,有沒有人有提示?Grails:如何使用sql函數自定義順序?

謝謝!

編輯

我終於成功地做我想要的東西,但有一個非常醜陋的解決方案:

  • 我添加了一個sqlProjection中,我把我的get_distance()函數,並能訂購通過它。
  • 添加一個投影會刪除對象屬性的檢索,所以我不得不通過添加屬性投影明確地要求它,並且我設法通過內省來做到這一點。
  • 然後我不得不定義它的標準結果轉換器給我域實例。

回答

1

如果使用hibernate SQL方言註冊您的函數,那麼您可以在HQL查詢中使用它。例如,把這個在你的引導代碼:

import org.hibernate.dialect.function.SQLFunctionTemplate 
import org.hibernate.Hibernate 

def dialect = applicationContext.sessionFactory.dialect 
def getDistance = new SQLFunctionTemplate(Hibernate.INTEGER, "get_distance(?1,?2)") 
dialect.registerFunction('get_distance', getDistance) 

然後你可以在HQL使用它:

Location.executeQuery(
    """ 
     select id, get_distance(latitude, longitude) as distance 
     from Location 
     order by distance 
    """, 
    [], [max: 10]) 
+0

感謝您的快速回答!事情是我需要具有相同的行爲,但在_createCriteria()_查詢。任何想法 ? – Allan 2012-04-16 16:44:20

+0

我想你可以使用'sqlRestriction'在條件中過濾函數,但我不知道有什麼方法可以用它來排序。 – ataylor 2012-04-16 17:06:40

0

我們所做的是以下幾點:

  1. 創建與查詢任何數據庫特定的操作符,但作爲視圖
  2. 創建一個新的域類對象只映射到視圖,從而允許您執行GORM標準查詢等
+0

不錯的黑客,但我不認爲它可以適用於我的情況:我的get_distance()函數需要參數,因爲它計算從給定座標的距離: select * from Location l order by get_distance(l.longitude,l.latitude, :longitude,:緯度) – Allan 2012-04-16 17:00:29

+0

好的..我沒有在DB中使用存儲過程/函數十多年了,除了第一個解決它之外沒有看到任何其他方法..你可以試着從更低級別的Hibernate角度.. http://stackoverflow.com/questions/7183110/hibernate-stored-procedure-result-problem – 2012-04-17 17:12:27