hibernate中HQL调用自定义函数 .

在编写hql语句时,如果使用自定义的函数,hql在编译过程中将无法编译通过,这时我们需要重写下dialect方言类,这里我的oracle是10,可以根据自己的oracle版本继承不同的oracle方言类。

解决错误的步骤:

    一、重写dialect类,如Oracle10gDialect

    二、修改hibernate的配置文件,将默认的方言类,改成我们重写的方言类

---------------数据库函数WX_F_GET_PARTYSTR 输入number输出varchar2------------

CREATE OR REPLACE FUNCTION WX_F_GET_PARTYSTR(V_DEPT_ID NUMBER --人员信息中包含的部门ID) RETURN VARCHAR2 AS

T_UP_DEPT NUMBER(10);--上级部门ID,临时参数

T_DEPT_TEMP VARCHAR2(2000);--部门名称

T_DEPT_STR VARCHAR2(2000);--要返回的已拼接部门名称字符串

BEGIN

//省略

END WX_F_GET_PARTYSTR;

--------------------------------一、重写方言类,函数名用小写 ---------------------------------------------------------

import org.hibernate.dialect.Oracle10gDialect;
import org.hibernate.dialect.function.SQLFunctionTemplate;
import org.hibernate.type.StringType;

public class MyDialect extends Oracle10gDialect{
	public MyDialect(){
		super();
		//函数名必须是小写,试验大写出错
		//SQLFunctionTemplate函数第一个参数是函数的输出类型,varchar2对应new StringType()    number对应new IntegerType()
		//?1代表第一个参数,?2代表第二个参数     这是数据库wx_f_get_partystr函数只需要一个参数,所以写成wx_f_get_partystr(?1)
		this.registerFunction("wx_f_get_partystr", new SQLFunctionTemplate(new StringType(), "wx_f_get_partystr(?1)"));
	}
}

------------------------二、修改hibernate配置文件,修改完成后重启服务---------------------------------------------

将原来的hibernate.dialect由原来的hibernate默认默认的,改成我们重写的方言类

<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>

改成

<property name="hibernate.dialect">com.haiyisoft.wx.web.struts.MyDialect</property>

-------------------   hql调用便可以识别  ---------------------

String hql="select new com.haiyisoft.entity.wx.AddressBook(a.userId,a.userName," +

"wx_f_get_partystr(a.department), " +

"a.position, a.mobile,a.email,a.weixinId,a.avatar,a.status) " +

"from WxContacts a where a.userId in("+userId_str+") order by substr(a.userName,0,1)";

时间: 2024-10-06 18:01:48

hibernate中HQL调用自定义函数 .的相关文章

如何在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:"

使用 {$INCLUDE} 或 {$I} 指令管理和调用自定义函数

这是一个简单.方便而又实用的小技巧. 譬如这段代码中有四个定义函数: MyAdd.MyDec.MyMul.MyDiv unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs; type   TForm1 = class(TForm)     procedure FormCreate(Sender: TObject);   en

C++面试题1:构造函数和虚构函数中能否调用虚函数?

C++面试题1:构造函数和虚构函数中能否调用虚函数? 构造函数跟虚构函数里面都可以调用虚函数,编译器不会报错. C++ primer中说到最好别用 由于类的构造次序是由基类到派生类,所以在构造函数中调用虚函数,虚函数是不会呈现出多态的 类的析构是从派生类到基类,当调用继承层次中某一层次的类的析构函数时意味着其派生类部分已经析构掉,所以也不会呈现多态 因此如果在基类中声明的纯虚函数并且在基类的析构函数中调用之,编译器会发生错误. class Base { public: Base() { Fuct

简述C/C++调用lua中实现的自定义函数

1.首先说下目的,为什么要这么做 ? 正式项目中,希望主程序尽量不做修改,于是使用C/C++完成功能的主干(即不需要经常变动的部分)用lua这类轻量级的解释性语言实现一些存在不确定性的功能逻辑:所以,程序功能如有问题,只需对lua脚本作出修改,而修改脚本的好处是简单高效,改完脚本后重新执行程序便能看到效果.  2.具体怎么做? 一般来说,C/C++调用lua接口或是数据交互,首先要做的是包含lua相关操作的头文件以及lua库相关的头文件,然后调用接口创建lua环境.用操作栈的规则和lua交互数据

Hibernate中HQL函数汇总及获取当前时间进行比较举例

在很多时候,我们负责的项目中,在数据访问层(DAO层)通常我们会使用sql语句或者hql语句,而在我们使用hql语句拼接时有时会报错,通常的原因是:我们使用了标准的sql语句,开启的确是hibernate的面向对象的语句 sessionFactory.getCurrentSession().createQuery(sql); 我们应改成 sessionFactory.getCurrentSession().createSQL(sql);就可以了. 但有时项目要求必须要使用hql,比如说将相应的接

Hibernate中HQL函数汇总及其说明

Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Language)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装.以下就是HQL的一些常用函数,有了这些函数,我们就可以拥有更多的灵活性,比如HQL如何取余,HQL如何返回集合的最值,HQL字符串处理,

SQL中存储过程和自定义函数的区别(转载)

存储过程:     存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量.有条件执行以及其它强大的编程功能.存储过程可包含程序流.逻辑以及对数据库的查询.它们可以接受参数.输出参数.返回单个或多个结果集以及返回值. 可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点: 1.可以在单个存储过程中执

SQL中存储过程和自定义函数的区别

存储过程:     存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量.有条件执行以及其它强大的编程功能.存储过程可包含程序流.逻辑以及对数据库的查询.它们可以接受参数.输出参数.返回单个或多个结果集以及返回值. 可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点: 1.可以在单个存储过程中执

SQL中存储过程与自定义函数的区别

存储过程 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程. 优点 ①重复使用.存储过程可以重复使用,从而可以减少数据库开发人员的工作量. ②提高性能.存储过程在创建的时候在进行了编译,将来使用的时候不再重新翻译.一般的SQL语句每