我可以用Hibernate自定义方言嵌套函数吗?

我可以用Hibernate自定义方言嵌套函数吗?,hibernate,hql,Hibernate,Hql,我有一个hibernate模型,它需要支持多个数据库(MySQL、Oracle、Sybase等),并且有一些数据逻辑。在浏览各种论坛/帖子时,我想到了为Hibernate创建自定义方言并注册一个函数的想法,每个方言都有特定于数据库的逻辑。这些功能运行得很好(只显示了相关的位-提前道歉,我不得不为帖子混淆一些值和字段名): 然而,现在我需要使用一个函数来解析传递给这个函数的参数。不幸的是,我无法访问使用此模型的代码,否则我只会将逻辑移到代码中,但有没有办法执行嵌套函数?我想使用“最大(x,y,z)

我有一个hibernate模型,它需要支持多个数据库(MySQL、Oracle、Sybase等),并且有一些数据逻辑。在浏览各种论坛/帖子时,我想到了为Hibernate创建自定义方言并注册一个函数的想法,每个方言都有特定于数据库的逻辑。这些功能运行得很好(只显示了相关的位-提前道歉,我不得不为帖子混淆一些值和字段名):

然而,现在我需要使用一个函数来解析传递给这个函数的参数。不幸的是,我无法访问使用此模型的代码,否则我只会将逻辑移到代码中,但有没有办法执行嵌套函数?我想使用“最大(x,y,z)”作为我的“日期”函数的参数。我基本上想让它起作用,但我失败了:

WHERE date_sub_days(GREATEST(:TRADE_HISTORY_MAX_DAYS,:ORDER_HISTORY_MAX_DAYS,:NEG_HISTORY_MAX_DAYS)) < value1
因为它不会将“最大”函数解析为单个参数

在MySQL中,我将以下内容打印到控制台:

Hibernate: 
select blah from blah where
    DATE_SUB(UTC_TIMESTAMP(),INTERVAL GREATEST(? DAY) < value1 
ERROR util.JDBCExceptionReporter - Parameter index out of range (2 > number of parameters, which is 1).
Hibernate: 
select blah from blah where 
SYSDATE - GREATEST(?<value1
ERROR util.JDBCExceptionReporter - Invalid column index
休眠:
从blah where中选择blah
日期(UTC时间戳(),间隔最大(?天)参数数,即1)。
在Oracle中,我将以下内容打印到控制台:

Hibernate: 
select blah from blah where
    DATE_SUB(UTC_TIMESTAMP(),INTERVAL GREATEST(? DAY) < value1 
ERROR util.JDBCExceptionReporter - Parameter index out of range (2 > number of parameters, which is 1).
Hibernate: 
select blah from blah where 
SYSDATE - GREATEST(?<value1
ERROR util.JDBCExceptionReporter - Invalid column index
休眠:
从blah where中选择blah

SYSDATE-magest(?我找不到一种让嵌套函数工作的方法,但我确实想出了一个非常简单的解决方法。它缺少我想要的代码重用(因此必须对所有函数进行任何更改),但至少它允许我继续使用自定义方言

与其尝试嵌套函数,不如:

WHERE date_sub_days(GREATEST(:TRADE_HISTORY_MAX_DAYS,:ORDER_HISTORY_MAX_DAYS,:NEG_HISTORY_MAX_DAYS))
我创建了一个单独的函数,包含更多参数:

WHERE date_sub_days_greatest(:TRADE_HISTORY_MAX_DAYS,:ORDER_HISTORY_MAX_DAYS,:NEG_HISTORY_MAX_DAYS)
并将逻辑嵌套在方言级别:

SQLFunctionTemplate dateSubDaysFunction = new SQLFunctionTemplate(Hibernate.DATE, "SYSDATE - ?1");
registerFunction("date_sub_days", dateSubDaysFunction);

SQLFunctionTemplate dateSubDaysGreatestFunction = new SQLFunctionTemplate(Hibernate.DATE, "SYSDATE - GREATEST(?1,?2,?3)");
registerFunction("date_sub_days_greatest", dateSubDaysGreatestFunction);

希望这对其他人有所帮助!

我找不到让嵌套函数工作的方法,但我确实想出了一个非常简单的解决方法。它缺少我想要的代码重用(因此必须对所有函数进行任何更改),但至少它允许我继续使用自定义方言

与其尝试嵌套函数,不如:

WHERE date_sub_days(GREATEST(:TRADE_HISTORY_MAX_DAYS,:ORDER_HISTORY_MAX_DAYS,:NEG_HISTORY_MAX_DAYS))
我创建了一个单独的函数,包含更多参数:

WHERE date_sub_days_greatest(:TRADE_HISTORY_MAX_DAYS,:ORDER_HISTORY_MAX_DAYS,:NEG_HISTORY_MAX_DAYS)
并将逻辑嵌套在方言级别:

SQLFunctionTemplate dateSubDaysFunction = new SQLFunctionTemplate(Hibernate.DATE, "SYSDATE - ?1");
registerFunction("date_sub_days", dateSubDaysFunction);

SQLFunctionTemplate dateSubDaysGreatestFunction = new SQLFunctionTemplate(Hibernate.DATE, "SYSDATE - GREATEST(?1,?2,?3)");
registerFunction("date_sub_days_greatest", dateSubDaysGreatestFunction);

希望这能对其他人有所帮助!

有什么想法吗?如果我不能让它发挥作用,它可能会使我使用习惯方言的整个设计无效…有什么想法吗?如果我不能让它发挥作用,它可能会使我使用习惯方言的整个设计无效。。。