【发布时间】:2012-04-26 17:55:02
【问题描述】:
我正在使用“upsert”,我需要知道它是否创建了新行。 SQL 的格式为:
update mytable set col1='value1' where (col2='value2');
insert into mytable select 'value1', 'value2' where not exists (select 1 from mytable where (col2='value2'));
如果我在 Postgres 中运行它,它会返回第二条语句的受影响行数。 IE。 “1 行受影响”如果它执行插入,“0 行受影响”如果它执行更新。这是我所期望的。
但是,如果我使用 javax.persistence.Query 对象在 JDBC+JPA 上运行它,我会得到相反的行为:如果它执行更新,则返回 1,而插入则返回 0。
Java 行为是否可靠? IE。我可以对此进行编码吗,或者它是否会随着驱动程序 jar 的未来版本而改变?
有没有更好的方法来编写 upsert,以便我也可以获取有关它执行了哪个操作的信息?
版本详情:我使用的是PostgreSQL 9.1,Java 6,JDBC驱动jar是postgresql-9.1-901.jdbc4.jar
感谢您的帮助!
【问题讨论】:
-
您是否在一个
executeUpdate()调用中运行这两个语句? -
是的,我是。两个单独的调用可能需要两次往返并且效率较低?还是我应该不在乎?
-
尝试运行两次 executeUpdate() 调用,看看是否为您提供了正确的更新计数。另外,您是否多次或仅一次致电
getMoreResults()和getUpdateCount()? -
谢谢。使用两个 executeUpdate() 调用有效。虽然做两次数据库调用是一种耻辱,但当一个人应该覆盖它时。我不认为 getMoreResults 和 getUpdateCount 是 JPA 的一部分。
标签: java sql postgresql jpa jdbc