我想在我的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中的FileInputStream(输入流) 2023-04-18
- Spring AOP 动态多数据源的实例详解 2023-08-01
- Spring中@RequestParam使用及遇到的一些坑 2023-01-18
- JAVA生成pdf文件的实操指南 2023-06-10
- SpringBoot实现自定义事件的方法详解 2023-01-24
- 使用Spring中的scope配置和@scope注解 2023-01-02
- Spring Retry重试框架的使用讲解 2023-06-30
- SpringBoot利用AOP实现一个日志管理详解 2023-05-19
- Java实现自定义LinkedList类的示例代码 2023-04-12
- Java实现快速排序算法可视化的示例代码 2023-04-23
