2

如果我从普通的 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 的一些关于使用 procs 和函数的文档,但是我很难理解它。谁能给我一个关于处理这个问题的正确方法的提示?

此外,由于我认为它可能是相关的,因此没有任何同义词可以允许调用该函数而不将其限定为 schema.package.function()。我相信这会让事情变得更加困难。这就是 Grails 1.3.7 的全部内容,但如果需要,我可以使用更高版本。

4

1 回答 1

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()")
于 2012-07-09T16:00:26.917 回答