`

Hibernate 3在HQL中不支持&运算

阅读更多
按位与运算(&)在许多数据库中都是支持的,遗憾的是,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入門

    HQL(Hibernate Query Language)是Hibernate提供的一种面向对象的查询语言,与SQL类似,但更加面向对象,使得开发者在处理数据时更加便捷。 在学习HQL之前,首先需要理解Hibernate的核心概念。Hibernate通过映射...

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

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

    hibernate hql语句

    在Hibernate 3中,可以使用HQL直接更新或删除数据库中的记录,这对于处理大量数据尤其有用。例如: - **更新记录**: ```java Transaction trans = session.beginTransaction(); String hql = "update User user...

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

    HQL是一种面向对象的查询语言,用于在Hibernate框架中执行数据检索任务。它允许开发人员以一种接近Java语言的方式进行数据库操作,从而简化了数据访问层的复杂度。 ### 1. from子句 `from`子句是HQL语句的基础,...

    hql语句查询

    这种运算方式在HQL中并不常见,但在某些特定场景下可能需要用到。 - **查询单个对象**: ```java Object uniqueResult = session.createQuery("FROM TableName WHERE column1 = :value").setParameter("value", ...

    HQL语句详解Select/update/deletefromwhere...

    HQL支持数据的更新与删除操作,这些功能是在Hibernate 3版本中引入的。例如,要将年龄为18的用户更新为20岁,可以使用以下HQL语句: ```java Transaction trans = session.beginTransaction(); String hql = ...

    HQL与QBC的查询条件.doc

    在Java持久化框架Hibernate中,查询机制是至关重要的部分,它允许开发者检索和操作数据库中的对象。HQL(Hibernate Query Language)和QBC(Query By Example)是Hibernate提供的两种主要的查询方式,它们提供了灵活...

    Hibernate3.2中文文档

    综上所述,Hibernate 3.2 中文文档详尽地阐述了如何利用 Hibernate 实现高效的数据库操作,无论是在查询、事务管理还是缓存策略等方面,都提供了丰富的功能和最佳实践,是 Java 开发者不可或缺的参考资料。

    NHibernate hql 可用函数,函数大全

    ### NHibernate HQL 可用函数详解 #### 一、查询基本语法与示例 **1. 基本查询** - **语法**: `FROM &lt;类名&gt; [WHERE &lt;条件&gt;]` - **示例**: `FROM Category c WHERE c.name &gt; 'c5'` **2. 排序查询** - **语法**: `...

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

     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查询语言语法

    HQL提供了丰富的语法支持,不仅能够方便地查询数据,还能进行复杂的聚合运算和数据转换。通过理解这些基本语法,开发者可以更好地利用Hibernate框架的强大功能,提高应用程序的数据访问效率和性能。

    hibernate3.1参考手册中文版1

    在Hibernate 3.1.2版本中,它提供了丰富的功能,包括实体管理、事务处理、缓存机制、查询语言(HQL)以及对Java Persistence API(JPA)的支持。 ### 主要特性 1. **对象关系映射(ORM)**:Hibernate的核心功能是...

    Hibernate几本书补充1

    2. **Hibernate配置**:讲解如何配置Hibernate的xml文件,包括persistence.xml和hibernate.cfg.xml,以及如何在项目中引入Hibernate库。 3. **实体类和映射文件**:详细阐述如何创建Java实体类,并用Hibernate的...

    Hibernate3.2手册

    HQL可以进行复杂的查询,如关联查询、分组、排序等,支持方法调用和函数运算。 六、 Criteria 查询 Criteria API提供了一种动态构建查询的方法,无需预先编写HQL。它可以更方便地根据运行时条件构造查询,减少了...

    hibernate源代码

    描述中的"hibernate实例源代码,可以直接导入eclipse环境运算"说明了这些源码是可运行的,可以被导入到Eclipse集成开发环境中,并进行调试和学习。这对于初学者来说是一个很好的资源,因为通过实际运行和修改代码,...

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

     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 ...

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

    - **计算属性值**:允许在查询中进行简单的数学运算。 - **函数支持**:支持常见的SQL函数如`lower`、`upper`等。 - **BETWEEN...AND...**和**IN**:用于过滤满足特定条件的结果集。 - **LIKE**:支持模式匹配查询,...

    hibernate in action

    4. **查询语言HQL**:介绍Hibernate查询语言,用于替代传统的SQL,提供更强大的查询功能,支持复杂的条件查询、分组、排序等。 5. ** Criteria API**:一种类型安全的查询方式,提供动态构建查询的能力,避免硬编码...

    Hibernate4离散结构课程在线考试系统

    此外,Hibernate4还支持HQL(Hibernate Query Language),一种面向对象的查询语言,让开发者能够更自然地表达数据库查询逻辑。 离散结构是计算机科学的基础课程,涵盖了集合论、图论、树、逻辑和计算复杂性等核心...

Global site tag (gtag.js) - Google Analytics