首页 > 解决方案 > 使用 Java 在 PostgreSQL 中执行 Upsert 返回值时出错

问题描述

我看过几篇关于这个主题的帖子(post1post2post3)。在所有这些中,解决方案看起来都非常简单,但我无法获得返回值的值。

这是我到目前为止所尝试的:

选项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" 值

pgadmin

注意:在每个选项中,查询的执行都没有问题,但我无法获得“更新”值

这是 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=<...>

标签: javapostgresqlgoogle-cloud-sql

解决方案


问题出在这里:

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

推荐阅读