按位与运算(&)在许多数据库中都是支持的,遗憾的是,Hibernate 3在HQL中不支持&运算,如果你写了如下的HQL:
where a.id & :mask = :target
则Hibernate报错:exception: unexpected char: '&'.
如何解决此问题?方法是利用Hibernate支持的自定义SQLFunction,定义一个bitand(a,b)的SQLFunction,然后,自己写一个解释器,生成a & b的SQL语句。
要实现一个自定义的SQLFunction,必须实现SQLFunction接口:
package com.js.dialect;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.QueryException;
import org.hibernate.dialect.function.SQLFunction;
import org.hibernate.engine.Mapping;
import org.hibernate.engine.SessionFactoryImplementor;
import org.hibernate.type.Type;
/**
* <p>
* Title:BitAndFunction
* </p>
* <p>
* Description:
* </p>
*
* @author js
* @version
* @since
*/
public class BitAndFunction implements SQLFunction {
public Type getReturnType(Type type, Mapping mapping) {
return Hibernate.INTEGER;
}
public boolean hasArguments() {
return true;
}
public boolean hasParenthesesIfNoArguments() {
return true;
}
public String render(List args, SessionFactoryImplementor factory)
throws QueryException {
if (args.size() != 2) {
throw new IllegalArgumentException(
"BitAndFunction requires 2 arguments!");
}
return args.get(0).toString() + " & " + args.get(1).toString();
}
}
然后,根据使用的数据库方言,派生一个自定义的CustomSQLDialect:
package com.js.dialect;
import org.hibernate.dialect.MySQLInnoDBDialect;
/**
* <p>
* Title:CustomSQLDialect
* </p>
* <p>
* Description:
* </p>
*
* @author js
* @version
* @since
*/
public class CustomSQLDialect extends MySQLInnoDBDialect {
/**
*
*/
public CustomSQLDialect() {
super();
registerFunction("bitand", new BitAndFunction());
}
}
设定函数名为bitand,参数和返回值均为Hibernate.LONG,现在,用CustomSQLDialect替换配置文件中的设置,
CustomSQLDialect 这个是注册自定义function用的,
在hibernate.xml 的prop里面配置。
例如<prop key="hibernate.dialect">com....CustomSQLDialect</prop>
中间换成你的路径
然后修改HQL:
where bitand(a.id, :mask) = :target
注:转自 http://hi.baidu.com/sushangzhou/blog/item/0f743bfa5a2ffb1f6d22eb9d.html
分享到:
相关推荐
hibernate查询之HQLhibernate查询之HQLhibernate查询之HQL
hibernate3-hql.jar .
Hibernate查询语言HQL.PPT
hibernate-HQL语句大全
Hibernate实例开发 HQL 与 QBC 查询
Hibernate查询语言HQL
Hibernate hql查询语法总结 Hibernate hql查询语法总结
Hibernate框架]Hql语句in中带参数的写法
HQL的全称是? 和SQL相比,HQL有哪些特点? HQL语句为:select jd.jdid,jd.jd from TblJd jd。怎样获得并显示查询结果? 使用'?'做占位符的参数查询,怎样设置参数的值? 命名参数查询的语法是? 怎样创建Criteria...
对hibernate的hql进行了详尽的讲解
weblogic12 下最新 org.hibernate.hql.ast.HqlToken解决办法
Hibernate注解方式、HQL查询
hibernate 中HQL语句查询学习笔记
我培训时用的 Hibernate 课件, 个人能力范围内精心整理,图文并茂.希望能对大家学习 Hibernate 提供帮助. 这是第三篇. 内容如下:HQL 查询;Query 接口及其主要方法;Select 子句;更新与删除;引用查询;联合查询;子查询;...
Hibernate数据检索(HQL)笔记Hibernate数据检索(HQL)笔记Hibernate数据检索(HQL)笔记Hibernate数据检索(HQL)笔记
一个关于Hibernate-HQL 的文档 内容实际而且实用
hibernate查询-hql等教程,对于学习hibernate有很好的帮助。
hibernate hql 语言大全 hql学习,这个文档是一个很全面,很不错的
Hibernate HQL基础练习小列子+数据库