我在sql中有一个自定义标量值函数,详细信息如下:
名称:fn\u工作日
返回:int
参数:1。startdate(type-datetime)2。结束日期(type-datetime)
我正在使用Hibernate5.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应该怎么做,因为我得到了下面的错误:errorsqlexceptionhelper:142 - “fn\u 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>
任何帮助解决上述问题将不胜感激。
2条答案
按热度按时间smdncfj31#
错误sqlexceptionhelper:142 - “fn\u workdays”不是可识别的函数名。
错误已经说明了什么是错误的,该函数在数据库中不存在。
试试这个:
vd8tlhqk2#
在jpql/hql中未预定义的函数的调用方式如下:
这是后来翻译成
fn_WorkDays(ua.created, current_date())
在本机查询中。你还需要用方言注册。