怎样在hibernate的HQL语句中使用mysql 的自定义函数?

问题:怎样在hibernate中使用mysql的函数?

1.hibernate支持原生态的sql语句查询,使用session.createSQLQuery()创建查询对象;

2.怎样在hql中使用mysql函数呢?

这时就需要重新定义hibernate的方言(dialect),将你需要用到的进行注册;

 这里提到一个方言(dialect)的概念:

  Hibernate底层依然使用SQL语句来执行数据库操作,虽然所有关系型数据库都支持使用标准SQL语句,但所有数据库都对标准SQL进行了一些扩展,所以在语法细节上存在一些差异,因此Hibernate需要根据数据库来识别这些差异。而方言(dialect)就是用来区分hibernate对应哪种数据库

 通常在使用Spring整合hibernate的时候,会有这样一段配置

<property name="hibernateProperties">
            <value>
                hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
                hibernate.show_sql=true
                hibernate.hbm2ddl.auto=none
                hibernate.format_sql=true
                hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
                hibernate.release_mode=auto
                hibernate.connection.isolation=1
                hibernate.connection.autocommit=false
                hibernate.cache.use_query_cache=false
                hibernate.cache.use_second_level_cache=false
                hibernate.jdbc.batch_size=25
                hibernate.jdbc.fetch_size=50
            </value>

其中红色的配置语句就是指明使用mysql方言,对于其他不同的数据库都有对应不同的方言,详情点击这里。

首先创建一个mysql函数,我们命名为my_change_local(number bigint)

--这里是使用navicat工具创建的函数BEGIN
    DECLARE stemp varchar(255);
    set stemp=‘‘;
  select sms.LabelId into stemp from sysmain.message sms where sms.id=number;
    RETURN stemp;
END

1.重写方言类,注册函数

public class MyLocalDialect extends MySQL5InnoDBDialect {

    public MyLocalDialect() {
        super();
        registerFunction("my_change_local",new SQLFunctionTemplate(StandardBasicTypes.STRING,"my_change_local(?1)"));
    }
}

2.修改配置文件,将数据库方言指向自己定义的方言类

   hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect  改为  hibernate.dialect=xxx.xxx.MyLocalDialect

3.之后就可以在hql中使用自己定义的函数了

时间: 2024-12-08 22:26:34

怎样在hibernate的HQL语句中使用mysql 的自定义函数?的相关文章

Hibernate的HQL语句中定位参数和具名参数传参

HQL查询: 1.有关hql 查询语句中的问好参数形式,如果出现多个问号,这对后面参数就比较麻烦. 如:from Student  student where student.name = ? and student.age=?.... 对这样的赋值,容易出错 可以采用另一种赋值的方法 如:from Student  student where student.name =:var1 and student.age=:var2.... query.setString("var1",&q

HQL语句中数据类型转换

我们需要从数据库中取出序号最大的记录,想到的方法就是使用order by子句进行排序(desc倒序),然后取出第一个对象,可是当初设计数据库时(我们是在原来的数据库的基础上开发新系统),竟然将序号字段的类型设成了varchar2,真是让人郁闷,这样的话,如果排序的话,就是对字符串排序,12是比2小的数,那么就需要转换一下类型. 以下写法调整中是错误的,不能执行,报空指针错误:select cast(t.a as Integer) from table_1 t 我也使用了这段代码,同样报空指针异常

如何在sqlite3连接中创建并调用自定义函数

#!/user/bin/env python # @Time :2018/6/8 14:44 # @Author :PGIDYSQ #@File :CreateFunTest.py '''如何在sqlite3连接中创建并调用自定义函数''' import sqlite3,hashlib #自定义函数 def md5sum(t): return hashlib.md5(t).hexdigest() #在内存中创建临时数据库 conn = sqlite3.connect(":memory:"

Hibernate写hql语句与不写hql语句的区别?

写hql语句与不写hql语句的区别? 写hql语句:书写HQL语句,所有的查询与投影的设计均使用HQL语句完成. 不写hql语句:没有任何查询语句,所有的查询与投影的设计使用面向对象格式完成. 二者选用的时机: 不写hql语句,有时比较方便,在不考虑复杂的查询的情况下,可以使用,此方法把某些Hibernate的方法封装起来,不灵活. 写hql语句,复杂的业务逻辑,建议使用,灵活方便. 以下通过俩种方法的对比来着重介绍一下hibernate不写hql的一种简单用法. 写hql语句: 具有丰富的灵活

hibernate之HQL语句

1. 什么是hql HQL是Hibernate Query Language的缩写 2. hql和sql区别/异同 HQL                                          SQL 类名/属性                                     表名/列名 区分大小写,关键字不区分大小写                   不区分大小 别名                                                别名 ?,

hibernate 之 HQL语句总结【转】

1. 查询整个映射对象所有字段 //直接from查询出来的是一个映射对象,即:查询整个映射对象所有字段 String hql = "from Users"; Query query = session.createQuery(hql); List<Users> users = query.list(); for(Users user : users){ System.out.println(user.getName() + " : " + user.ge

Hibernate 的HQL语句,初级

这里讲解简单的HQL语句,因为很多比较复杂的外查询,用一般的查询很难完成 所以这里需要使用HQL @Test public void selquery(){ System.out.printf("hello"); Configuration config = new Configuration(); SessionFactory sessionfactory = config.configure("hibernate.cfg.xml").buildSessionFa

where语句中不能直接使用聚合函数

1.问题描述 select deptno ,avg(sal) from emp where count(*)>3 group by deptno; 在where 句中使用聚合函数count(*),报出错误:ORA-00934: group function is not allowed here 那是为什么呢? 2.问题解决: 大致解释如下,sql语句的执行过程是:from-->where-->group by -->having --- >order by --> s

hibernate中hql语句中list和iterate区别

1.使用list()方法获取查询结果,每次发出一条语句,获取全部数据.2.使用iterate()方法获取查询结果,先发出一条SQL语句用来查询满足条件数据的id,然后依次按照这些id查询记录,也就是要执行N+1条SQL语句(N为符合条件的记录数) 两次执行list()方法,每次执行都是发出一条SQL语句,查询所有数据.下面看看两次执行iterate()方法的输出情况两次执行iterate()方法,第一次执行时发出了N+1条SQL语句,而第二次执行,则只发出一套SQL语句,与先执行list()方法