当前位置:首页 > 开发 > 开源软件 > 正文

【转】解决Hibernate 3不支持 "&" 运算的SQL语句

发表于: 2012-03-31   作者:asialee   来源:转载   浏览次数:
摘要: 转: http://blog.csdn.net/explorering/article/details/1196397 按位与运算(&)在许多数据库中都是支持的,遗憾的是,Hibernate 3在HQL中不支持&运算,如果你写了如下的HQL: where a.id & :mask = :target 则Hibernate报错:exception: une
转: http://blog.csdn.net/explorering/article/details/1196397

按位与运算(&)在许多数据库中都是支持的,遗憾的是,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替换配置文件中的设置,然后修改HQL:

where bitand(a.id, :mask) = :target

编译,运行,观察Hibernate的SQL输出,执行不成功!不认识"bitand"!

【转】解决Hibernate 3不支持 "&" 运算的SQL语句

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
数据库采用1,2,4,8,16.....等用数字标识的状态字段可以进行累加,对存在的几种状态进行组合,从而可形
数据库采用1,2,4,8,16.....等用数字标识的状态字段可以进行累加,对存在的几种状态进行组合,从而可形
错误提示: 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错
本例效果图: 代码文件: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Class
Hibernate 3 Formulas(翻译) Hibernate 和 Spring 这两个突出的开源框架被越来越多的应用到 J2EE
  QSqlQuery类提供了一个用于执行SQL语句和浏览查询的结果集的接口。   QSqlQueryModel和QSqlTa
1、查询待导出表 Ad中的数据。 SELECT * FROM [DB_Temp].[dbo].[Ad] 2、编写存储过程。 1
原文: 使用SQL语句创建SQL数据脚本(应对万网主机部分不支持导出备份数据) 1、查询待导出表 Ad中的
分析错误产生的原因: GridView是利用SqlDataSourse进行数据绑定,在绑定的时候生成Insert,Delete
今天,用Visual Studio 2008+SQL Server2005 做一个简单的利用GridView更新数据是出现一个错误. 错
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号