转:
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"!
分享到:
相关推荐
BeetSql支持将SQL语句存储在外部文件中,例如`.md`文件,便于管理和维护。 ```markdown # 用户查询 ## 查询所有用户 select * from t_user; ``` ##### 2.5 代码与SQL生成 BeetSql提供了丰富的API来生成SQL语句,...
通过创建数据库连接,执行SQL语句,以及使用DataSet、DataTable等对象,C#能够高效地处理数据。 二、Hibernate ORM框架: Hibernate是一个流行的Java领域中的ORM(对象关系映射)框架,但也有其.NET版本,用于简化...
### Hibernate HQL 语句详解 #### HQL (Hibernate Query Language) 概述 HQL是一种专门为Hibernate设计的查询语言,其语法结构接近于标准SQL,但又具有面向对象的特性。HQL允许开发者以一种更为简洁、直观的方式...
Hibernate 3.2 支持直接执行 SQL 语句,并能自动映射结果到 Java 对象。 ### 7. Caching 为了提高性能,Hibernate 3.2 引入了缓存机制。一级缓存(Session 缓存)是默认的,而二级缓存(可配置的)可以跨多个 ...
第3章 第一个Hibernate应用 3.1 创建Hibernate的配置文件 3.2 创建持久化类 3.3 创建数据库Schema 3.4 创建对象-关系映射文件 3.4.1 映射文件的文档类型定义(DTD) 3.4.2 把Customer持久化类映射到...
Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,而无需编写大量的SQL语句。在Hibernate 3.1.2版本中,它提供了丰富的功能,包括实体管理、事务处理、缓存机制、查询...
它允许开发者使用面向对象的方式来操作数据库,而无需直接编写SQL语句。在本项目中,Hibernate可能被用来管理论坛帖子、用户等实体的生命周期,包括创建、读取、更新和删除(CRUD)操作。 3. **EL表达式**: ...
第3章 第一个Hibernate应用 3.1 创建Hibernate的配置文件 3.2 创建持久化类 3.3 创建数据库Schema 3.4 创建对象-关系映射文件 3.4.1 映射文件的文档类型定义(DTD) 3.4.2 把Customer持久化类映射到...
在完成条件设置后,调用Criteria对象的list()方法,Hibernate会在运行时根据Criteria对象中的条件动态构造SQL语句并执行,返回查询结果列表。 需要注意的是,Expression方法中的属性参数(如"name","sex")是实体...
Hibernate是一款开源的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者能够用面向对象的方式来处理数据,而无需直接编写SQL语句。 一、Hibernate简介 Hibernate的核心功能是提供一个映射机制,将...
HQL支持各种表达式,包括比较、逻辑运算、成员测试等。例如: - `from DomesticCat cat where cat.name between 'A' and 'B'`:筛选名字在“A”到“B”之间的`DomesticCat`。 - `from Cat cat where cat.name is ...
- 随着技术的发展,SQL经历了多次更新,包括SQL-92、SQL:1999(SQL3)、SQL:2003(SQL4)等多个版本。 - **数据库简史:** - 数据库的发展可以追溯到20世纪60年代的层次模型和网状模型。 - 关系型数据库在20世纪...
SQL支持多种表达式和条件语句,如算术运算符(+、-、*、/)、比较运算符(=、、>、<、>=、)以及逻辑运算符(AND、OR、NOT)。这些运算符可以组合使用,构建复杂的查询条件。 #### 函数 SQL提供了丰富的内置函数,...
- **函数支持**:支持常见的SQL函数如`lower`、`upper`等。 - **BETWEEN...AND...**和**IN**:用于过滤满足特定条件的结果集。 - **LIKE**:支持模式匹配查询,通过`%`和`_`等通配符实现模糊查询。 - **ORDER BY**:...
第3章 第一个Hibernate应用 3.1 创建Hibernate的配置文件 3.2 创建持久化类 3.3 创建数据库Schema 3.4 创建对象-关系映射文件 3.4.1 映射文件的文档类型定义(DTD) 3.4.2 把Customer持久化类映射到...
第3章 第一个Hibernate应用 3.1 创建Hibernate的配置文件 3.2 创建持久化类 3.3 创建数据库Schema 3.4 创建对象-关系映射文件 3.4.1 映射文件的文档类型定义(DTD) 3.4.2 把Customer持久化类映射到...
2. **动态SQL**:IBATIS2支持在SQL映射文件中进行条件判断和逻辑运算,使SQL语句的生成更具灵活性,满足不同的查询需求。 3. **参数映射**:IBATIS2可以自动将Java对象的属性值映射到SQL语句的参数,简化了数据绑定...
Hibernate 中,HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者用类名、属性和关联来编写查询,而不是直接使用数据库的SQL语句。HQL的基础包括了各种查询条件的设定,这些条件使得我们可以...