2012-07-09 41 views
2

如果我取回我從一個普通的SQL查詢想要的數據,以下就足夠了:從Grails HQL中,我將如何使用(非聚合)Oracle函數?

select * from stvterm where stvterm_code > TT_STUDENT.STU_GENERAL.F_Get_Current_term() 

我有一個Grails領域已正確設置了這個表,我可以成功運行下面的代碼:

def a = SaturnStvterm.findAll("from SaturnStvterm as s where id > 201797") as JSON 
a.render(response) 
return false 

換句話說,我可以在Oracle函數的結果中硬編碼,並讓HQL正常運行,但它會阻塞任何可以用函數嘗試的方式。我已閱讀了關於使用特效和函數的一些關於Hibernate的文檔,但我很難理解它。任何人都可以給我一個暗示,以正確的方式來處理這個問題嗎?

另外,因爲我認爲它可能是相關的,所以沒有任何同義詞可以讓函數被調用,而不會將其限定爲schema.package.function()。我相信這會讓事情變得更加困難。這些都是爲了Grails 1.3.7,不過如果需要的話,我可以使用更高版本。

回答

1

要在HQL中調用函數,SQL方言必須注意它。您可以在運行時BootStrap.groovy添加功能是這樣的:

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

def dialect = applicationContext.sessionFactory.dialect 
def getCurrentTerm = new SQLFunctionTemplate(Hibernate.INTEGER, "TT_STUDENT.STU_GENERAL.F_Get_Current_term()") 
dialect.registerFunction('F_Get_Current_term', getCurrentTerm) 

註冊後,你應該能夠調用函數在查詢:

def a = SaturnStvterm.findAll("from SaturnStvterm as s where id > TT_STUDENT.STU_GENERAL.F_Get_Current_term()") 
+0

感謝ataylor。我很感激幫助。花了我一點時間來獲取appContext,但是一旦我有了,一切都按預期工作。 – 2012-07-09 18:15:35