java - 使用 Java 在 PostgreSQL 中执行 Upsert 返回值时出错
问题描述
我看过几篇关于这个主题的帖子(post1、post2、post3)。在所有这些中,解决方案看起来都非常简单,但我无法获得返回值的值。
这是我到目前为止所尝试的:
选项1:
int affectedRows =pstmt.executeUpdate();
ResultSet rs = pstmt.getResultSet();
if (rs.next())
updated = rs.getBoolean(1);
结果:
java.lang.NullPointerException
由 if 引起(rs.next())
选项 2:
ResultSet rs =pstmt.executeQuery();
if (rs.next())
{updated = rs.getBoolean(1);}
结果:
org.postgresql.util.PSQLException: No results were returned by the query
选项 3:
boolean hasResult =pstmt.execute();
logger.info("hasResult: " + hasResult);
//if (hasResult) {
ResultSet rs = pstmt.getResultSet();
if (rs.next())
updated = rs.getBoolean(1);
//}
logger.info("updated: " + updated);
结果:
java.lang.NullPointerException
原因由 if(rs.next())
也注意到hasResult: false
在 Java 代码中创建的查询如下所示:
INSERT INTO public."tablename"( "field1", "field2", ...,"field n")
VALUES('value1','value2',...,'value n')
ON CONFLICT ("UniqueID")
DO UPDATE SET "field1" = 'value3' ,..., "Updated"=true
RETURNING "Updated"
如果我使用例如 pgadmin 执行查询,我会看到 RETURNING "Updated" 值
注意:在每个选项中,查询的执行都没有问题,但我无法获得“更新”值
这是 Maven 依赖项:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.12</version>
</dependency>
<dependency>
<groupId>com.google.cloud.sql</groupId>
<artifactId>postgres-socket-factory</artifactId>
<version>1.0.15</version>
</dependency>
和连接字符串:
jdbc:postgresql://google/postgres?cloudSqlInstance=<...>&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=<...>&password=<...>
解决方案
问题出在这里:
PreparedStatement pstmt = conn.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);
当我创建PreparedStatement pstmt
我使用的对象时Statement.RETURN_GENERATED_KEYS
常量的使用Statement.RETURN_GENERATED_KEYS
是与 getGeneratedKeys 一起使用来获取由该执行创建的所有行的自动生成的键。
就像我想要一个特定的返回元素一样,我应该使用:
PreparedStatement pstmt = conn.prepareStatement(SQL);
推荐阅读
- c - 如何从另一个程序访问信号量数据
- javascript - 网络摄像头不转到页面
- video-streaming - 以 HTML5 播放存储在云平台上的视频
- python - 如何确定类不相等
- javascript - “gameActivity”键在开始时改变,但它应该停止
- node.js - “npm run”命令在 Windows 上失败
- c# - 如何在 EF6 和 asp.net core 3 之间建立连接
- java - 如何记录 doPost() 方法?
- javascript - Keycloak - 如何禁用两个(Angular)客户端应用程序之间的共享会话?
- ios - Swift 版本更新的正确语义版本控制更改