2012-04-26 834 views
0

我正在使用「upsert」,我需要知道它是否創建了新行。 的SQL的形式爲:PostgreSQL中的Upsert(update + insert)通過JDBC/JPA返回奇怪的行數

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的運行它,它返回受影響的行數的第2個聲明。即「1行受影響」如果它插入,「0行受影響」,如果它更新。這是我所期望的。

Howevere如果我使用javax.persistence.Query對象通過JDBC + JPA運行它,我會得到相反的行爲:如果它執行更新,則返回1,插入操作返回0。

Java行爲是否可靠? 也就是說我可以對此進行編碼嗎,還是可能隨着驅動程序jar的未來版本而改變?

有沒有更好的寫作upsert的方法,以便我還可以獲取有關哪個操作的信息?

版本的詳細信息:我使用PostgreSQL 9.1,Java 6中,並且JDBC驅動程序的jar是PostgreSQL相關9.1-901.jdbc4.jar

謝謝您的幫助!

+0

你是否在單個'executeUpdate()'調用中運行這兩個語句? – 2012-04-26 19:11:46

+0

是的,我。兩個獨立的電話可能需要兩次往返,效率較低?或者我應該不在乎? – 2012-04-27 13:48:41

+0

嘗試運行兩個executeUpdate()調用,看看是否給你正確的更新計數。你是不是也一次或只調用了一次'getMoreResults()'和'getUpdateCount()'? – 2012-04-27 20:47:06

回答

1

在Java中,你應該能夠找回的行數爲每個語句,每JDBC API文檔:

http://docs.oracle.com/javase/6/docs/api/java/sql/Statement.html#execute%28java.lang.String%29

PostgreSQL文檔提供,其中這是在PLPGSQL功能做了一個例子:

http://www.postgresql.org/docs/9.1/interactive/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING

外觀爲merge_db()的代碼示例。

+0

我正在使用JPA接口:javax.persistence.Query.executeUpdate()http://docs.oracle.com/javaee/5/api/javax/persistence/Query.html#executeUpdate() – 2012-04-27 13:45:16