`
together
  • 浏览: 220400 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

hibernate中where语句解析及pg中bool类型匹配的问题

阅读更多
  想测试一下将系统部署在postgresql下,下载了8.2的noinstaller.zip包(考察一下免安装数据库的效果),发现仍然不支持以管理员身份启动服务。数据库初始化好以后,启动resin,一访问系统,出错!经检查,发现出错SQL:
  ERROR:  operator does not exist: boolean = integer。这和hibernate没关系,是sql语句的错误。想起来了,原因是这样的:
  我的系统中,对任何数据的操作,都不作物理删除,而是打标记,每个PO均有enabled字段,为boolean类型。对应到不同的数据库中,字段类型也不一样:
oracle为number(1)
sqlserver为bit
mysql为bit
postgresql为bool
hsqldb为boolean
firebird为smallint。

对应的所有hbm.xml文件的关联中,都会加上 where="enabled=1",以保证取出的关联对象和集合是正确的数据。比如下面的:
<set
            name="children"
            lazy="true"
            cascade="none"
            sort="unsorted"
            order-by="idx,id"
            where="enabled=1"
        >
            <key       column="parent_id"            >
            </key>
            <one-to-many class="cn.bidlink.omeng.hbm.menu.SystemMenu"/>
        </set>


  postgresql的sql语句判断非常严格,不允许写类似enabled=1这样的sql。报错是boolean ==integer,类型匹配错误。但是除了postgresql外,这条SQL在其它所有的数据库上都是允许的。应该说所有的布尔型,最终都是一位bit,或者是0,或者是1,不存在真正的true和false。那么以0和1来作判断,也应该是正确的SQL嘛。

  那现在好了,我如果确实需要在pg上部署,那就把所有hbm.xml文件中的where="enabled=1"改为where="enabled=true"好了吧,hibernate应该会自动转化为“enabled=true”这样的sql了吧。但实际情况并不是这样,hibernate会将sql转化为类似
“from object o where o.enabled=o.true”这样的sql,当然是无法正确执行的。经过分析,发现where="enabled=xxx"中,当xxx为数字或字符串时,是能正确解析的,但xxx为true时,则无法正确解析。
  这算不算hibernate的一个bug呢?

补充说明:hibernate版本为3.2GA。

后记:发现PG中可以使用bool='true' 或bool='1'来进行正常匹配。
分享到:
评论
2 楼 together 2006-12-15  
呵呵,我在家里试了半天,也发现用bool='true'或bool='1'是可以正常匹配的。但是这样更不合常理啊,倒不如直接让bool=1,bool=0能够匹配成功显得更合理。

bool='true',是布尔型和字符串来比较,PG本身对字符串型作了类型转换处理,但为什么不对1和0也作布尔类型转换呢?不解。其它数据库都是作了相应的类型转换的。

而bool='1',在oracle/sqlserver/mysql/firebird都会做类型转换,匹配成功。但是在HSQLDB中,不认同这种匹配。

看来做一个通用的系统,还真的是很困难。

现在的解决办法也就是针对PG,专门处理HBM文件了。
1 楼 liuwangxia 2006-12-15  
改为这个应该可以:
where="enabled='1'" 



经测试,下面的语句在 PostgreSQL 8.1 中执行都返回布尔值 true
select true='1';
select true='true';
select true='TRUE';
select true='t';
select true='T';



运行下面这个语句则报错信息与楼上相同:
select true=1;



下面这个语句在 PostgreSQL 8.1 中执行正确,在 SQL Server 2000 中执行失败:
select 'true' where true



经查实,true false 都是 SQL 的关键字,应该是 hibernate 的一个 bug。
PostgreSQL 中的 SQL 关键字
SQL Server 2005 保留关键字

相关推荐

    C#中bool类型的分析好好学习

    在 C# 中,bool 类型是一个非常重要的地位,它广泛应用于条件语句、循环语句和逻辑运算中。 在 C# 中,bool 类型是通过关键字 bool 声明的,例如:`bool isAdmin = true;`。bool 类型可以赋值为 true 或 false,...

    C#中的bool类型的学习与应用

    C#中的bool类型的学习与应用 bool类型是C#语言中的一种基本数据类型,它用于存储布尔值true和false。 bool类型的变量可以存储一个布尔值,用于在程序中进行逻辑判断和控制流程。 1. bool类型的声明和赋值 在C#中...

    bool类型bool类型bool类型.txt

    bool类型

    C语言中bool类型的使用

    C语言中bool类型的使用 C语言中bool类型的使用是指在C语言中使用bool类型变量来存储真假值的方法。在C99标准中,C语言增加了bool类型的原始数据类型,可以和其他数据类型一样正常使用。bool类型变量只能存放两个值...

    pl0增加添加对布尔bool类型的支持处理

    在编程语言中,布尔(Bool)类型是一种基本的数据类型,用于表示逻辑状态,通常只有两个值:真(True)和假(False)。在PL/0语言中,原版设计并没有包含布尔类型的内置支持。然而,根据提供的标题和描述,这里有一...

    c语言中bool的用法

    bool类型可以用于控制流语句中的条件判断,例如: ```c if (isTrue) { // 条件成立时的代码 } else { // 条件不成立时的代码 } ``` 函数返回值 bool类型可以用于函数返回值,例如: ```c bool isEven(int num) { ...

    JSON传递bool类型数据的处理方式介绍

    在服务器与客户端进行数据交互的过程中,经常会涉及到各种数据类型的传递,而布尔类型(bool)是其中的一种基本数据类型。本文将详细介绍在使用JSON传递布尔类型数据时,在客户端可能会遇到的问题以及如何正确处理。...

    pl0增加增添bool布尔处理支持

    在PL/0中引入bool类型,意味着程序员可以使用布尔表达式进行更复杂的逻辑控制,例如if语句和while循环等。bool类型通常包括两个预定义的常量:true和false,分别代表真和假。在PL/0中,这可能需要对语法解析器、...

    string转化成int,double,bool

    下面我们将详细探讨如何进行这些类型转换,并讨论在转换过程中可能出现的数据溢出问题。 首先,让我们看下如何将`string`转换为`int`。在大多数编程语言中,都有内置的方法或函数来完成这一任务。例如,在Python中...

    编译原理课设 Bool类型文法 词法语法语义 Java完整代码实现

    在本项目中,"编译原理课设 Bool类型文法 词法语法语义 Java完整代码实现" 是一个关于编译器设计的实践任务,它涵盖了编译过程的关键环节,包括词法分析、语法分析以及语义分析。下面将详细讨论这些知识点。 1. **...

    动态组合linq的Where语句

    要点一:Linq的查找语句可以多个Where条件组合查询,那么只需要传递每个Where的Func,bool&gt;就可以了 要点二:用Tag值来传递Func的内容。ctl.Tag = i =&gt; true;

    编译原理-课程设计-bool条件语句

    在编译原理中,课程设计通常涉及实际应用理论知识来构建一个简单的编译器或解析器。本项目专注于实现布尔条件语句的编译,主要处理Pascal语言中的比较操作和逻辑运算。以下是对这个主题的详细阐述: 1. **编译原理*...

    C#串口读写三菱PLC,可读单个bool,批量bool,Word,Dword,心跳信号等等。

    在本文中,我们将深入探讨如何使用C#编程语言与三菱PLC进行串口通信,实现对PLC的数据读写操作,包括单个布尔值、批量布尔值、单字(Word)和双字(Dword)。此外,我们还将讨论串口连接的监控以及多线程在该过程中...

    bool 有趣的代码

    在GNU Bool中,用户可以使用类似于布尔代数的语法来构建复杂的文件搜索条件,这使得寻找特定类型的文件变得更为灵活和精确。 布尔表达式由以下基本元素组成: 1. **逻辑运算符**:主要包括`AND`(通常表示为`&&`或`...

    bool2byte_bool2byte_SCL_bit2byte转换_

    本话题关注的是在SCL中进行数据类型转换,特别是“bool2byte”和“bit2byte”的转换,这对于处理PLC内部的布尔值和字节数据至关重要。 首先,我们来看“bool2byte”转换。在SCL中,布尔值(bool)是基本的数据类型...

    bool与BOOL的区别

    在编程领域,特别是在C++与C语言相关的开发中,`bool`与`BOOL`是两种常见的布尔类型表示方式。虽然它们都用于处理真/假的逻辑值,但在不同的上下文中有着本质的区别。理解这些差异对于编写高效、可维护的代码至关...

    Swift教程:Swift基础,布尔类型

    在`switch`语句中,布尔类型同样可以作为匹配条件,但需要注意,Swift的`switch`要求所有分支覆盖所有可能性,因此通常需要结合`default`来处理`true`和`false`。 6. **函数返回布尔值** 很多函数会返回一个布尔...

    pl0 bool增添的短路

    标题"pl0 bool增添的短路"指的是在PL0语言中添加了布尔运算符的短路行为。PL0是一种简单的教学语言,用于解释编译原理的基础概念。现在,我们来详细探讨这个知识点。 布尔运算符包括逻辑与(AND)和逻辑或(OR)。...

    Dart 集合类型List Set Map详解 以及循环语句 forEach map where any every.zip

    本教程将深入探讨三种主要的集合类型:List、Set和Map,以及几种常用的循环语句,如forEach、map、where、any和every。这些概念对于理解Dart中的数据处理至关重要。 1. **List**: List是有序的元素集合,可以包含...

Global site tag (gtag.js) - Google Analytics