Hibernate 中的自定义标量值函数 5.x
Custom Scalar Valued function in Hibernate 5.x
我在 SQL 中有一个自定义标量值函数,具有以下详细信息:
- 姓名:fn_WorkDays
- Returns : 整数
- 参数:1.StartDate(类型 - 日期时间)2.EndDate(类型 - 日期时间)
我正在使用 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);
看了一些帖子后,我了解到自定义函数在使用前需要注册,因此创建了以下 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())
。你仍然需要像你一样用方言注册它。
ERROR SqlExceptionHelper:142 - 'fn_WorkDays' is not a recognized function name.
错误已经说错了,数据库中不存在该函数。
试试这个:
registerFunction("fn_WorkDays", new VarArgsSQLFunction(StandardBasicTypes.INTEGER, "dbo.fn_WorkDays(", ",", ")"));
我在 SQL 中有一个自定义标量值函数,具有以下详细信息:
- 姓名:fn_WorkDays
- Returns : 整数
- 参数:1.StartDate(类型 - 日期时间)2.EndDate(类型 - 日期时间)
我正在使用 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);
看了一些帖子后,我了解到自定义函数在使用前需要注册,因此创建了以下 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())
。你仍然需要像你一样用方言注册它。
ERROR SqlExceptionHelper:142 - 'fn_WorkDays' is not a recognized function name.
错误已经说错了,数据库中不存在该函数。
试试这个:
registerFunction("fn_WorkDays", new VarArgsSQLFunction(StandardBasicTypes.INTEGER, "dbo.fn_WorkDays(", ",", ")"));