2012-07-09 22 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