如果我要从普通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正确运行,但是它阻塞了我可以尝试使用该函数的任何方式。我已经阅读了一些有关使用proc和函数的有关Hibernate的文档,但是我很难理解它。谁能给我一个有关处理此问题的正确方法的提示?
另外,由于我认为这可能是相关的,因此没有任何同义词可以在不将其限定为schema.package.function()的情况下调用该函数。我相信这会使事情变得更加困难。这就是Grails 1.3.7的全部内容,不过如果需要,我可以使用更高的版本。
最佳答案
要在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()")
关于sql - 在gral HQL中,我将如何使用(非聚合的)Oracle函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11396151/