在 PostgreSQL 中使用 Java 执行 Upsert 返回值时出错

Error with returning value using Java to perform Upsert in PostgreSQL

我看过几个关于这个话题的 post (post1,,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" 值

注意:在每个选项中,查询都没有问题地执行,但我无法获得 "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=<...>

尝试 ResultSet rs=stmt.executeQuery(sql)
看不到 sql 的传递位置。

PreparedStatement statement = connection.prepareStatement(sql);
ResultSet result = statement.executeQuery();

问题出在这里:

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);