读书人

hibernate中where语句解析及pg中bool类

发布时间: 2012-11-16 14:12:14 作者: rapoo

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 name="code">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 保留关键字 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文件了。

读书人网 >软件架构设计

热点推荐