在 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);
我看过几个关于这个话题的 post (post1,
这是我目前尝试过的方法:
选项 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);