我想在我的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查询中调用它们
基础教程推荐
- Java编写实现多人聊天室 2023-05-19
- SpringBoot深入了解日志的使用 2023-03-06
- Java内存泄露 2023-10-08
- Spring Boot MQTT Too many publishes in progress错误的解决方案 2023-02-11
- Spring Security权限想要细化到按钮实现示例 2023-03-07
- springcloud如何获取网关封装的头部信息 2023-01-13
- Java Swagger使用教程 2023-03-11
- java – 大规模MySQL更新 2023-11-04
- Quarkus中ConfigSourceInterceptor的加密配置实现 2022-10-24
- Spring Data JPA系列JpaSpecificationExecutor用法详解 2023-06-02