Hibernate 3在HQL中不支持&运算
按位与运算(&)在许多数据库中都是支持的,遗憾的是,Hibernate3在HQL中不支持&运算,如果你写了如下的HQL:
wherea.id&:mask=:target
则Hibernate报错:exception:unexpectedchar:'&'.
如何解决此问题?方法是利用Hibernate支持的自定义SQLFunction,定义一个bitand(a,b)的SQLFunction,然后,自己写一个解释器,生成a&b的SQL语句。
要实现一个自定义的SQLFunction,必须实现SQLFunction接口:
packagecom.js.dialect;
importjava.util.List;
importorg.hibernate.Hibernate;
importorg.hibernate.QueryException;
importorg.hibernate.dialect.function.SQLFunction;
importorg.hibernate.engine.Mapping;
importorg.hibernate.engine.SessionFactoryImplementor;
importorg.hibernate.type.Type;
/**
*<p>
*Title:BitAndFunction
*</p>
*<p>
*Description:
*</p>
*
*@authorjs
*@version
*@since
*/
publicclassBitAndFunctionimplementsSQLFunction{
publicTypegetReturnType(Typetype,Mappingmapping){
returnHibernate.INTEGER;
}
publicbooleanhasArguments(){
returntrue;
}
publicbooleanhasParenthesesIfNoArguments(){
returntrue;
}
publicStringrender(Listargs,SessionFactoryImplementorfactory)
throwsQueryException{
if(args.size()!=2){
thrownewIllegalArgumentException(
"BitAndFunctionrequires2arguments!");
}
returnargs.get(0).toString()+"&"+args.get(1).toString();
}
}
然后,根据使用的数据库方言,派生一个自定义的CustomSQLDialect:
packagecom.js.dialect;
importorg.hibernate.dialect.MySQLInnoDBDialect;
/**
*<p>
*Title:CustomSQLDialect
*</p>
*<p>
*Description:
*</p>
*
*@authorjs
*@version
*@since
*/
publicclassCustomSQLDialectextendsMySQLInnoDBDialect{
/**
*
*/
publicCustomSQLDialect(){
super();
registerFunction("bitand",newBitAndFunction());
}
}
设定函数名为bitand,参数和返回值均为Hibernate.LONG,现在,用CustomSQLDialect替换配置文件中的设置,
CustomSQLDialect这个是注册自定义function用的,
在hibernate.xml的prop里面配置。
例如<propkey="hibernate.dialect">com....CustomSQLDialect</prop>
中间换成你的路径
然后修改HQL:
wherebitand(a.id,:mask)=:target
注:转自http://hi.baidu.com/sushangzhou/blog/item/0f743bfa5a2ffb1f6d22eb9d.html