如果我从普通的sql查询中检索我想要的数据,则以下就足够了:
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,但如果需要,我可以使用更高版本。
答案 0 :(得分: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()")