java - Hibernate 5.x 中的自定义标量值函数
问题描述
我在 SQL 中有一个自定义标量值函数,具有以下详细信息:
- 名称:fn_WorkDays
- 返回:整数
- 参数: 1. StartDate (type - datetime) 2. EndDate (type - datetime)
我正在使用 Hibernate 5.4.6 从数据库中获取一些记录。我想在 HQL 中使用上述函数(在 Where 子句中),但目前面临问题。
Query<Device> query = session.createQuery("Select ud from Device ud where fn_WorkDays(ua.created, current_date())>2", Device.class);
在浏览了一些帖子后,我了解到自定义函数需要在使用前注册,因此创建了以下类:
public class MySQLServerDialect extends SQLServerDialect {
public MySQLServerDialect() {
super();
registerFunction("fn_WorkDays", new VarArgsSQLFunction(StandardBasicTypes.INTEGER, "fn_WorkDays(", ",", ")"));
}
}
已将 hibernate.cfg.xml 更新为:
<property name="dialect">com.test.service.utils.MySQLServerDialect</property>
我似乎不明白 registerFunction 应该如何完成,因为我收到以下错误: 错误 SqlExceptionHelper:142 - 'fn_WorkDays' 不是可识别的函数名称。
Log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<!-- Console Appender -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout
pattern="%d{yyyy-MMM-dd HH:mm:ss a} [%t] %-5level %logger{36}:%L - %msg%n" />
</Console>
</Appenders>
<Loggers>
<!-- Log everything in hibernate -->
<Logger name="org.hibernate" level="debug" additivity="false">
<AppenderRef ref="Console" />
</Logger>
<!-- Log SQL statements -->
<Logger name="org.hibernate.SQL" level="debug" additivity="false">
<AppenderRef ref="Console" />
</Logger>
<!-- Log JDBC bind parameters -->
<Logger name="org.hibernate.type.descriptor.sql" level="trace" additivity="false">
<AppenderRef ref="Console" />
</Logger>
<!-- Log custom packages -->
<Logger name="com.test.service" level="debug" additivity="false">
<AppenderRef ref="Console" />
</Logger>
<Root level="error">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
任何解决上述问题的帮助将不胜感激。
解决方案
JPQL/HQL 中未预定义的函数调用如下:
`function('fn_WorkDays' , ua.created, current_date())`
这稍后会fn_WorkDays(ua.created, current_date())
在本机查询中翻译。您仍然需要像您一样通过方言注册它。
推荐阅读
- maven - Maven Surefire 插件没有选择参数
- php - 用户应该只能支付由他进行的注册
- c++ - 当期望程序根据用户输入再次循环时,它会导致 Segmentation Fault: 11
- android - 无法通过支持库使用自动调整 Textview
- angularjs - 如何在过渡开始期间找到目标状态
- python - a[lst+1][item] 导致错误,而 a[lst-1][item] 很好
- angular - Angular 6 - ngModel在绑定显示数据时显示对象对象
- swift - Swift 有没有类似于 numpy.diff 的函数来计算数组相邻元素之间的差异
- powershell - ConvertFrom-JSON 需要时间、CPU 和内存来处理较大的文件(文件大小:180 MB)
- javascript - 使 Highcharts 的“共享”工具提示颜色与系列颜色不同