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

相关推荐