从Grails HQL中,我如何使用(非聚合)Oracle函数?

时间:2012-07-09 13:35:51

标签: sql hibernate grails groovy hql

如果我从普通的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,但如果需要,我可以使用更高版本。

1 个答案:

答案 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()")