
今天在把一个项目的数据库,从 oracle 切换到 postgres 时, 遇到了问题
UserLogic.java User user = getUserAFromXXX(); user.setUpdateTime( new Date() ); UserDao.update( user ); 执行到 update()时,报错如下:
错误: 语法错误 在 "(" 或附近的 update ( select * from USER where TYPE=1 ) set UPDATETIME = NOW() where TYPE=1 看了一下,User 分为 2 种形式,UserA 和 UserB 。
两者在数据库中,对应着同一张表,都为 USER 表。
唯一的不同仅在于 A 的 type = 1 ,B 的 type = 2 。
当需要使用 type = 1 的数据时,则取 UserA 的 entity ,反之亦然。
UserA.hbm.xml: <class name="userA" table="USER" lazy="true" > <subselect> select * from USER where TYPE=1 </subselect> ……(下略)…… UserB.hbm.xml: <class name="userB" table="USER" lazy="true" > <subselect> select * from USER where TYPE=2 </subselect> ……(下略)…… 回到最开始的提问,原本 SQL 是:
update USER set UPDATETIME = NOW() where TYPE=1 因为现在这种写法,变成了:
update ( select * from USER where TYPE=1 ) set UPDATETIME = NOW() where TYPE=1 以前的数据库是 oracle 的,这种写法倒是也能更新进去。现在数据库换成了 Postgres ,直接报语法错误了。
看了下 hibernate 的官方文档,<subselect>应该是只读,不能用于更新,不知道为什么原来的程序员这么写。
不知道怎么改了,还望各位大佬不吝赐教,小的感激不尽。
1 itechify PRO hibernate 太久没用了,会不会是没有更换方言呀 |
2 Ununennium OP |