0

「アップサート」を使用していますが、新しい行が作成されたかどうかを知る必要があります。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 で実行すると、2 番目のステートメントで影響を受ける行の数が返されます。つまり、挿入を行う場合は「影響を受ける 1 行」、更新を行う場合は「影響を受ける行 0」です。これは私が期待するものです。

ただし、javax.persistence.Query オブジェクトを使用して JDBC+JPA でこれを実行すると、逆の動作になります。更新の場合は 1 が返され、挿入の場合は 0 が返されます。

Java の動作は信頼できますか? つまり、それに対してコーディングできますか、またはドライバーjarの将来のリリースで変更される可能性がありますか?

アップサートを記述して、それが行った操作に関する情報も取得するためのより良い方法はありますか?

バージョンの詳細: PostgreSQL 9.1、Java 6 を使用しており、JDBC ドライバーの jar は postgresql-9.1-901.jdbc4.jar です。

ご協力ありがとうございました!

4

1 に答える 1

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() コード サンプルを探します。

于 2012-04-26T18:47:22.970 に答える