首页 > 解决方案 > Hibernate 5.x 中的自定义标量值函数

问题描述

我在 SQL 中有一个自定义标量值函数,具有以下详细信息:

我正在使用 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>

任何解决上述问题的帮助将不胜感激。

标签: javahibernatehql

解决方案


JPQL/HQL 中未预定义的函数调用如下:

`function('fn_WorkDays' , ua.created, current_date())`

这稍后会fn_WorkDays(ua.created, current_date())在本机查询中翻译。您仍然需要像您一样通过方言注册它。


推荐阅读