浏览 5353 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-12-15
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'来进行正常匹配。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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 保留关键字 |
|
返回顶楼 | |
发表时间: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文件了。 |
|
返回顶楼 | |