`

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

 
阅读更多
转: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"!
分享到:
评论
2 楼 asialee 2012-12-03  

希望大家以后注册自定义函数的时候,看看该数据库是否已经实现了该自定义的函数了,希望这个对大家有帮助。
1 楼 asialee 2012-12-03  

    今天遇到一个问题,发现mysql的可以注册,但是H2数据库的死活不行,后来经过调试和分析代码发现,H2数据库天生支持bitand,代码在org.hibernate.dialect.H2Dialect

registerFunction( "acos", new StandardSQLFunction( "acos", Hibernate.DOUBLE ) );
		registerFunction( "asin", new StandardSQLFunction( "asin", Hibernate.DOUBLE ) );
		registerFunction( "atan", new StandardSQLFunction( "atan", Hibernate.DOUBLE ) );
		registerFunction( "atan2", new StandardSQLFunction( "atan2", Hibernate.DOUBLE ) );
		registerFunction( "bitand", new StandardSQLFunction( "bitand", Hibernate.INTEGER ) );
		registerFunction( "bitor", new StandardSQLFunction( "bitor", Hibernate.INTEGER ) );
		registerFunction( "bitxor", new StandardSQLFunction( "bitxor", Hibernate.INTEGER ) );

相关推荐

    BeetlSQL 2.10中文文档

    BeetSql支持将SQL语句存储在外部文件中,例如`.md`文件,便于管理和维护。 ```markdown # 用户查询 ## 查询所有用户 select * from t_user; ``` ##### 2.5 代码与SQL生成 BeetSql提供了丰富的API来生成SQL语句,...

    C#Hibernate数据库海量读写快速存储

    通过创建数据库连接,执行SQL语句,以及使用DataSet、DataTable等对象,C#能够高效地处理数据。 二、Hibernate ORM框架: Hibernate是一个流行的Java领域中的ORM(对象关系映射)框架,但也有其.NET版本,用于简化...

    hibernate hql语句

    ### Hibernate HQL 语句详解 #### HQL (Hibernate Query Language) 概述 HQL是一种专门为Hibernate设计的查询语言,其语法结构接近于标准SQL,但又具有面向对象的特性。HQL允许开发者以一种更为简洁、直观的方式...

    Hibernate3.2中文文档

    Hibernate 3.2 支持直接执行 SQL 语句,并能自动映射结果到 Java 对象。 ### 7. Caching 为了提高性能,Hibernate 3.2 引入了缓存机制。一级缓存(Session 缓存)是默认的,而二级缓存(可配置的)可以跨多个 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    第3章 第一个Hibernate应用  3.1 创建Hibernate的配置文件  3.2 创建持久化类  3.3 创建数据库Schema  3.4 创建对象-关系映射文件  3.4.1 映射文件的文档类型定义(DTD)  3.4.2 把Customer持久化类映射到...

    hibernate3.1参考手册中文版1

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,而无需编写大量的SQL语句。在Hibernate 3.1.2版本中,它提供了丰富的功能,包括实体管理、事务处理、缓存机制、查询...

    论坛java源码(SpringMVC+Hibernate+EL表达式)

    它允许开发者使用面向对象的方式来操作数据库,而无需直接编写SQL语句。在本项目中,Hibernate可能被用来管理论坛帖子、用户等实体的生命周期,包括创建、读取、更新和删除(CRUD)操作。 3. **EL表达式**: ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

    第3章 第一个Hibernate应用  3.1 创建Hibernate的配置文件  3.2 创建持久化类  3.3 创建数据库Schema  3.4 创建对象-关系映射文件  3.4.1 映射文件的文档类型定义(DTD)  3.4.2 把Customer持久化类映射到...

    Hibernate_QBC查询[归类].pdf

    在完成条件设置后,调用Criteria对象的list()方法,Hibernate会在运行时根据Criteria对象中的条件动态构造SQL语句并执行,返回查询结果列表。 需要注意的是,Expression方法中的属性参数(如"name","sex")是实体...

    Hibernate3.2手册

    Hibernate是一款开源的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者能够用面向对象的方式来处理数据,而无需直接编写SQL语句。 一、Hibernate简介 Hibernate的核心功能是提供一个映射机制,将...

    全面解析HQL语句 非常详细直接的HQL语句的功能介绍

    HQL支持各种表达式,包括比较、逻辑运算、成员测试等。例如: - `from DomesticCat cat where cat.name between 'A' and 'B'`:筛选名字在“A”到“B”之间的`DomesticCat`。 - `from Cat cat where cat.name is ...

    SQL21自学通

    - 随着技术的发展,SQL经历了多次更新,包括SQL-92、SQL:1999(SQL3)、SQL:2003(SQL4)等多个版本。 - **数据库简史:** - 数据库的发展可以追溯到20世纪60年代的层次模型和网状模型。 - 关系型数据库在20世纪...

    SQL

    SQL支持多种表达式和条件语句,如算术运算符(+、-、*、/)、比较运算符(=、、&gt;、&lt;、&gt;=、)以及逻辑运算符(AND、OR、NOT)。这些运算符可以组合使用,构建复杂的查询条件。 #### 函数 SQL提供了丰富的内置函数,...

    安博Hibernate最全培训资料内部版

    - **函数支持**:支持常见的SQL函数如`lower`、`upper`等。 - **BETWEEN...AND...**和**IN**:用于过滤满足特定条件的结果集。 - **LIKE**:支持模式匹配查询,通过`%`和`_`等通配符实现模糊查询。 - **ORDER BY**:...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

    第3章 第一个Hibernate应用  3.1 创建Hibernate的配置文件  3.2 创建持久化类  3.3 创建数据库Schema  3.4 创建对象-关系映射文件  3.4.1 映射文件的文档类型定义(DTD)  3.4.2 把Customer持久化类映射到...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

    第3章 第一个Hibernate应用  3.1 创建Hibernate的配置文件  3.2 创建持久化类  3.3 创建数据库Schema  3.4 创建对象-关系映射文件  3.4.1 映射文件的文档类型定义(DTD)  3.4.2 把Customer持久化类映射到...

    IBATIS2开发指南

    2. **动态SQL**:IBATIS2支持在SQL映射文件中进行条件判断和逻辑运算,使SQL语句的生成更具灵活性,满足不同的查询需求。 3. **参数映射**:IBATIS2可以自动将Java对象的属性值映射到SQL语句的参数,简化了数据绑定...

    Hibernate HQL基础 限定查询条件 .doc

    Hibernate 中,HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者用类名、属性和关联来编写查询,而不是直接使用数据库的SQL语句。HQL的基础包括了各种查询条件的设定,这些条件使得我们可以...

Global site tag (gtag.js) - Google Analytics