`
together
  • 浏览: 217658 次
  • 性别: 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 保留关键字

相关推荐

Global site tag (gtag.js) - Google Analytics