我想在我的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 lambda表达式与泛型整理总结 2023-03-21
- java线程安全锁ReentrantReadWriteLock原理分析readLock 2023-06-10
- springboot+vue实现登录功能的最新方法整理 2023-01-02
- SpringBoot实现点餐系统的登录与退出功能流程详解 2023-06-10
- Servlet服务端实现原理详解 2023-03-21
- RocketMQ Push 消费模型示例详解 2023-05-24
- Java实现图形化界面的日历 2023-01-02
- Spring Boot详解创建和运行基础流程 2023-01-18
- 往DAO类中注入@PersistenceContext和@Resource的区别详解 2022-10-31
- java中Calendar与Date类型互相转换的方法 2023-05-18
