Hibernate中自定义数据库函数

前段日子在用Hibernate在MySQL数据库中查询数据时,出现了如下MySql语法错误:

Hibernate: select count(*) as col_0_0_ from customer customer0_ where 1=1 and (customer0_.primary_customer_id is null) and (birthday between date_add(curdate(), INTERVAL -22, DAY) and curdate())
2010-09-11 02:44:23,281 WARN [org.hibernate.util.JDBCExceptionReporter] - <SQL Error: 1064, SQLState: 42000>
2010-09-11 02:44:23,281 ERROR [org.hibernate.util.JDBCExceptionReporter] - <You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' DAY) and curdate())' at line 1>

于是查阅Mysql语法,发现这样的写法没错啊,date_add函数是这样使用呀~

在网上找了一下,发现还真有不少人遇到这个问题,也有人提供了许多解决办法(奇怪的是这些解决办法基本上是人家外国网站上有人提出的,中文网站上我没见到过,呵呵),其中包括:创建自定义函数、改变查询方式等变通方式。

但也有一个从根本上解决问题的方式:自定义Dialect中的方法,使其支持Mysql中对应的方法。这一点,得从Hibernate对各数据库的本地语言支持说起了。

在Hibernate中,它可以支持大多数主流数据库,在与各数据库结合时,它通过Dialect(即数据库本地化语言)将执行的SQL语句转换为对应数据库中的可执行SQL(因为不同数据库中,SQL会存在一些语法的不一样),所以使用Hibernate与不同的数据库连接时,需要指定对应的Dialect。在我做的这个项目中,使用的是Mysql,因此,也就使用了下面的Dialect:

hibernate.dialect=org.hibernate.dialect.MySQLDialect

但为什么使用了正确的Dialect之后,还是会出现上面这个情况呢?
那是因为上面SQL中的INTERVAL是Hibernate语法中的关键词,它不会认为是Mysql中的关键词,于是在解析SQL时就出错了!
那如何才能自定义一个方法,让它支持这样的语法呢?很简单,看一下上面MySQLDialect中的源码,你就会一下子就明白了:我们只需要重新注册一个方法即可!示例代码如下:

package com.cloudframework.dialect;

import org.hibernate.Hibernate;
import org.hibernate.dialect.MySQLDialect;
import org.hibernate.dialect.function.SQLFunctionTemplate;

public class MysqlDialect extends MySQLDialect {

public MysqlDialect() {
super();
registerFunction("date_add_interval", new SQLFunctionTemplate(Hibernate.DATE, "date_add(?1, INTERVAL ?2 ?3)"));
}

}

在上面的代码中,我们定义了一个date_add_interval方法,目的是使它支持MySQL中的date_add函数中的INTERVAL。
然后我们使用这个自定义的Dialect:
hibernate.dialect=com.cloudframework.dialect.MysqlDialect

再然后,将我们上面的SQL改为如下:

select count(*) as col_0_0_ from customer customer0_ where 1=1 and (customer0_.primary_customer_id is null) and (birthday between date_add_interval(curdate(), -22, DAY) and curdate())

然后再执行,就OK了!
hibernate 调用oracle函数 NULL 博文链接:https://jadeluo.iteye.com/blog/1213549 立即下载

相关推荐

基于JAVA的GB28181实现之SIP服务核心组件解析

本文深入解析了基于JAVA的GB28181标准中SIP服务的核心组件实现,包括协议栈选择、消息处理引擎、事务管理器等关键技术点。通过实战案例分享海康威视、大华设备的特殊处理技巧,并提供性能优化和常见问题排查指南,帮助开发者高效构建稳定的视频监控系统。

weixin_30892037的博客 264

NHibernate使用sql自定义函数&HQL使用sql自定义函数:NHibernate-自定义方言

前提:近日使用了NHibernate的IUserType自定义类型,用于对字段进行处理(取完数据对数据处理),由于部分情况下需要使用sql语句进行查询,则用到了mysql自定义函数,使用HQL不指明自定义函数的话会报错,无法查询数据。 NHibernate使用自定义函数配置: 1 using System; 2 using System.Collections.Gene...

weixin_30698297的博客 298

AD5940阻抗测量开发板实战:从源码获取到工程调试全解析

本文详细解析了AD5940阻抗测量开发板的实战应用,从源码获取到工程调试的全过程。AD5940作为ADI公司的高精度阻抗测量前端芯片,适用于生物阻抗分析、电化学传感器等领域。文章提供了开发环境搭建、工程配置、常见问题排查及进阶调试技巧,帮助开发者快速掌握AD5940开发板的使用方法。

weixin_30919429的博客 213

使用HIBERNATE调用自定义函数

最近的项目打算用SPRINGMVC+HIBERNATE来实现,因为我们打算把这个项目做成一个产品,所以使用HIBERNATE希望 可以部署在不同的数据库服务器上。     但是使用HQL调用自定义函数的时候却出现了问题。比如 select user.id, my_function(user.id) from USER u,执行这个HQL 会报如下的错误: java.lang.Illegal

fkbush的专栏 2348

基于PI双闭环解耦控制的三相SVPWM电压型逆变器(1)--数学模型

三相电压型逆变器、双PI控制、SVPWM、解耦

weixin_58670090的博客 1万+

高效敏感词检测API平台对比与选型指南

本文为开发者提供了高效敏感词检测API平台的选型指南。文章对比了专业API平台、头部云厂商、新兴AI服务商及开源方案,从检测能力、集成易用性、成本、稳定性及扩展性五大维度进行分析,并给出实战选型建议,帮助团队根据业务场景快速选择最合适的敏感词检测服务。

weixin_29325955的博客 347

HQL调用自定义函数

1.创建自己的方言 public class DialectRegExp extends Oracle9iDialect{ public DialectRegExp(){ super(); this.registerFunction("my_xy", new SQLFunctionTemplate(new IntegerType(),"get_sal(?1)")); } ...

mixer_a的专栏 401

Android BLE扫描指南:解决设备发现问题

假设你正在开发一个MAUI应用,用于扫描并连接到BLE设备。你的代码在Windows上运行得很好,但在Android上却无法发现任何设备。尽管你已经在中声明了必要的权限,并且在运行时请求这些权限,扫描还是无法工作。

m0_62153576的博客 224

hibernate调用过程、函数

1.通过Hibernate API或者JDBC,API调用存储过程: CallableStatement cal = sess.connection().prepareCall( "{Call scott.selectdept(?,?)}"); cal.setString(1, 10 + ""); cal.registerOutParameter(2, OracleTypes...

WEBCODE 291

Android16 3576 u盘固件升级功能添加

1.在u-boot/drivers/power/pmic/rk8xx.c。这里是读取power键的寄存器判断长短按。

tzj1058756809的博客 576

【微服务】Spring AI Alibaba Jmus 从部署到项目实战详解

Spring AI Alibaba Jmus 从部署到项目实战详解

congge 4192

hibernate调用数据库自定义函数

本文使用的是Oracle9i数据库,hibernate3.0,spring2.0,jdk6。 首先在数据库中定义函数。 1.以下是数据库中定义的函数:         create or replace function Get_Djbh return varchar2 is              Result varchar2(10);              nNum Number...

itcast123的专栏 219

【HomeAssistant接入的设备实现天猫精灵】

Home Assistant的HassLife组件: 此Home Assistant的组件可以让天猫精灵、小爱同学对接HomeAssistant平台上的设备,控制设备、查询上报设备状态。 注意:本插件只负责上报HomeAssistant的设备状态信息到服务器,控制功能需要在HassLife 平台上配置。.........

vor234的博客 1万+

HIBERNATE调用数据库自定义函数

 本文使用的是Oracle9i数据库,hibernate3.0,spring2.0,jdk6。 首先在数据库中定义函数。 1.以下是数据库中定义的函数:         create or replace function Get_Djbh return varchar2 is              Result varchar2(10);              nNum Numbe...

zpfsupervisor的专栏 350

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Hibernate 针对Oracle 特有函数及自定义函数的实现办法

http://www.dingl.com/view.shtml?xh=419Hibernate 针对Oracle 特有函数及自定义函数的实现办法--DingL.com

wenzi_li的专栏 221

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

如何通过Hibernate调用oracle自定义函数

如果oralce内置的一些函数不能够满足我们开发的要求,那样势必要通过自己写一个函数,那么是如何调用的呢?我们可以在hbm.xml中调用,例如:"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> Mapping file autogenerated by MyEclipse Persistence Tools-->  

ヤ哖少輕狂ご--Roger's ZOME 1634

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

从一次生产环境分页Bug,聊聊Hibernate方言(Dialect)那些“坑”

本文通过一个生产环境分页Bug案例,深入探讨Hibernate方言(Dialect)的隐秘陷阱及其影响。文章详细分析了方言不匹配导致的分页查询错乱问题,并提供了全链路排查方法、方言机制解析及现代最佳实践,帮助开发者避免类似问题。

weixin_33737774的博客 175

hibernate 注册自定义函数

1.创建自己的方言 public class DialectRegExp extends Oracle9iDialect{ public DialectRegExp(){ super(); this.registerFunction("my_xy", new SQLFunctionTemplate(new IntegerType(),"get_sal(?1)")); this.regis

洋洋的专栏 2821

Hibernate 针对 Oracle 特有函数及自定义函数的实现办法

Hibernate 能支持数据库特有的函数,如 Oracle 的 connect by,Substr吗?能支持自己写的函数吗?答案是完全可以的! 最近有个项目在使用 Struts + Hibernate 开发,也碰到使用 Oracle connect by、自定义写的函数的困扰问题,后来查了很多相关的资料, 终于找到一个解决办法(不知是不是最好的?呵,希望你们指点一下): 1、首...

zhouyi8510的专栏 219

怎么在hql里调用自定义的函数

qq_42315935的博客 282
上一篇: 给flexigrid扩展两项功能
下一篇: 基于xmlrpc的远程控制管理
hellohank
博客等级 码龄19年 0粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值