按位与运算(&)在许多数据库中都是支持的,遗憾的是,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替换配置文件中的设置,
CustomSQLDialect 这个是注册自定义function用的,
在hibernate.xml 的prop里面配置。
例如<prop key="hibernate.dialect">com....CustomSQLDialect</prop>
中间换成你的路径
然后修改HQL:
where bitand(a.id, :mask) = :target
注:转自 http://hi.baidu.com/sushangzhou/blog/item/0f743bfa5a2ffb1f6d22eb9d.html
分享到:
相关推荐
HQL(Hibernate Query Language)是Hibernate提供的一种面向对象的查询语言,与SQL类似,但更加面向对象,使得开发者在处理数据时更加便捷。 在学习HQL之前,首先需要理解Hibernate的核心概念。Hibernate通过映射...
Hibernate 中,HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者用类名、属性和关联来编写查询,而不是直接使用数据库的SQL语句。HQL的基础包括了各种查询条件的设定,这些条件使得我们可以...
在Hibernate 3中,可以使用HQL直接更新或删除数据库中的记录,这对于处理大量数据尤其有用。例如: - **更新记录**: ```java Transaction trans = session.beginTransaction(); String hql = "update User user...
HQL是一种面向对象的查询语言,用于在Hibernate框架中执行数据检索任务。它允许开发人员以一种接近Java语言的方式进行数据库操作,从而简化了数据访问层的复杂度。 ### 1. from子句 `from`子句是HQL语句的基础,...
这种运算方式在HQL中并不常见,但在某些特定场景下可能需要用到。 - **查询单个对象**: ```java Object uniqueResult = session.createQuery("FROM TableName WHERE column1 = :value").setParameter("value", ...
HQL支持数据的更新与删除操作,这些功能是在Hibernate 3版本中引入的。例如,要将年龄为18的用户更新为20岁,可以使用以下HQL语句: ```java Transaction trans = session.beginTransaction(); String hql = ...
在Java持久化框架Hibernate中,查询机制是至关重要的部分,它允许开发者检索和操作数据库中的对象。HQL(Hibernate Query Language)和QBC(Query By Example)是Hibernate提供的两种主要的查询方式,它们提供了灵活...
综上所述,Hibernate 3.2 中文文档详尽地阐述了如何利用 Hibernate 实现高效的数据库操作,无论是在查询、事务管理还是缓存策略等方面,都提供了丰富的功能和最佳实践,是 Java 开发者不可或缺的参考资料。
### NHibernate HQL 可用函数详解 #### 一、查询基本语法与示例 **1. 基本查询** - **语法**: `FROM <类名> [WHERE <条件>]` - **示例**: `FROM Category c WHERE c.name > 'c5'` **2. 排序查询** - **语法**: `...
17.1.12 在HQL查询语句中绑定参数 17.1.13 设置查询附属事项 17.1.14 在映射文件中定义命名查询语句 17.1.15 在HQL查询语句中调用函数 17.2 设定查询条件 17.2.1 比较运算 17.2.2 范围运算 17.2.3 ...
HQL提供了丰富的语法支持,不仅能够方便地查询数据,还能进行复杂的聚合运算和数据转换。通过理解这些基本语法,开发者可以更好地利用Hibernate框架的强大功能,提高应用程序的数据访问效率和性能。
在Hibernate 3.1.2版本中,它提供了丰富的功能,包括实体管理、事务处理、缓存机制、查询语言(HQL)以及对Java Persistence API(JPA)的支持。 ### 主要特性 1. **对象关系映射(ORM)**:Hibernate的核心功能是...
2. **Hibernate配置**:讲解如何配置Hibernate的xml文件,包括persistence.xml和hibernate.cfg.xml,以及如何在项目中引入Hibernate库。 3. **实体类和映射文件**:详细阐述如何创建Java实体类,并用Hibernate的...
HQL可以进行复杂的查询,如关联查询、分组、排序等,支持方法调用和函数运算。 六、 Criteria 查询 Criteria API提供了一种动态构建查询的方法,无需预先编写HQL。它可以更方便地根据运行时条件构造查询,减少了...
描述中的"hibernate实例源代码,可以直接导入eclipse环境运算"说明了这些源码是可运行的,可以被导入到Eclipse集成开发环境中,并进行调试和学习。这对于初学者来说是一个很好的资源,因为通过实际运行和修改代码,...
17.1.12 在HQL查询语句中绑定参数 17.1.13 设置查询附属事项 17.1.14 在映射文件中定义命名查询语句 17.1.15 在HQL查询语句中调用函数 17.2 设定查询条件 17.2.1 比较运算 17.2.2 范围运算 17.2.3 ...
- **计算属性值**:允许在查询中进行简单的数学运算。 - **函数支持**:支持常见的SQL函数如`lower`、`upper`等。 - **BETWEEN...AND...**和**IN**:用于过滤满足特定条件的结果集。 - **LIKE**:支持模式匹配查询,...
4. **查询语言HQL**:介绍Hibernate查询语言,用于替代传统的SQL,提供更强大的查询功能,支持复杂的条件查询、分组、排序等。 5. ** Criteria API**:一种类型安全的查询方式,提供动态构建查询的能力,避免硬编码...
此外,Hibernate4还支持HQL(Hibernate Query Language),一种面向对象的查询语言,让开发者能够更自然地表达数据库查询逻辑。 离散结构是计算机科学的基础课程,涵盖了集合论、图论、树、逻辑和计算复杂性等核心...