java – 如何注册SQL函数,以便可以使用JPA和Hibernate在JPQL或HQL查询中调用它们

我想在我的HQL查询中使用自定义函数,并在我的数据库中注册一个函数,这是我的函数的sql代码:BEGINDECLARE user_id_var VARCHAR(64);SELECT e.usernameFROMusers e where e.id=30 INTO user_id_var; return user...

我想在我的HQL查询中使用自定义函数,并在我的数据库中注册一个函数,这是我的函数的sql代码:

BEGIN
DECLARE user_id_var VARCHAR(64);
    SELECT 
    e.username
FROM
   users e  where e.id=30 INTO user_id_var;   
    return user_id_var;
END

并将其注册为MysqlCustomDilect类:

public class MysqlCustomDilect extends MySQLDialect{

    public MysqlCustomDilect() {
        super();
        registerFunction("getActiveUser", new StandardSQLFunction("getActiveUser"));
}

}

并将此行添加到hibernate.cfg.xml文件中:

<property name="hibernate.dialect" value="myProject.common.MysqlCustomDilect" />

并在我的dao层中将其称为此代码:

@Override
    public List<Entity> getAll() {
        Session session = getSession();
        String hql = " select e.id as id,function('getActiveUser') as name from " + domainClass.getName() + " e ";
        Query query=session.createQuery(hql);
        return query.list();

    }

但是hibernate不知道它并引发这个错误:

unexpected token: function near line 1, column 18 [ from e.id as id,function('getActiveUser') ........

解决方法:

JPA支持调用这样的用户定义函数:

select i 
from Item i 
where function( 'substring', i.name, 1, 3 ) = 'abc'" )

首先,您的功能不完整,您只粘贴了正文,而不是函数名称.

其次,你是连接字符串,所以你冒着SQL Injection attacks的风险.

第三,HQL格式不正确:

来自e.id.

你怎么选择标识符? FROM子句应该是列出实体.

因此,HQL最有可能:

select e, function('getActiveUser',) as name
from MyEntity e

为什么要连接domainClass.getName()?如果实体查询是动态的,请使用Criteria API.

您还可以使用MetadataBuilderContributor注册函数:

public class SqlFunctionsMetadataBuilderContributor
        implements MetadataBuilderContributor {

    @Override
    public void contribute(MetadataBuilder metadataBuilder) {
        metadataBuilder.applySqlFunction(
            "group_concat",
            new StandardSQLFunction(
                "getActiveUsers",
                StandardBasicTypes.STRING
            )
        );
    }
}

并通过hibernate.metadata_builder_contributor配置属性向Hibernate提供自定义MetadataBuilderContributor:

<property>
    name="hibernate.metadata_builder_contributor"
    value="com.vladmihalcea.book.hpjp.hibernate.query.function.SqlFunctionsMetadataBuilderContributor"
</property>

有关详细信息,请查看this article.

本文标题为:java – 如何注册SQL函数,以便可以使用JPA和Hibernate在JPQL或HQL查询中调用它们

基础教程推荐