Java JDBC 如何使用 RETURNING 语句处理更新查询

Posted

技术标签:

【中文标题】Java JDBC 如何使用 RETURNING 语句处理更新查询【英文标题】:Java JDBC How to Handle Update Query with RETURNING Statement 【发布时间】:2018-06-05 08:22:40 【问题描述】:

我有一个简单的 sql 查询,它将版本增加 1 并返回 postgresql 中的当前值,例如:

UPDATE table SET version = version + 1 where id = 'XXX' RETURNING version

但是我无法在 jdbcTemplate.update 语句中使用它:

int version = jdbcTemplate.update(sqlString, new Object[] id); 

抛出异常:

没有预期的结果时返回了结果

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [UPDATE table SET version = version + 1 where id = ? RETURNING version]; A result was returned when none was expected.; nested exception is org.postgresql.util.PSQLException: A result was returned when none was expected.

RETURNING 语句的正确使用方法是什么?

【问题讨论】:

抛出什么异常! org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [UPDATE table SET version = version + 1 where id = ?返回版本];预期没有结果时返回结果。嵌套异常是 org.postgresql.util.PSQLException: A result was returned when none is expected. 请发minimal reproducible example 【参考方案1】:

我找到了解决方案。而不是 jdbcTemplate.update 我使用 jdbcTemplate.query 并将 number 转换为 int 来获取版本的值。谢谢大家。

    Number number = jdbcTemplate.queryForObject(sqlString, new Object[] id, Integer.class);
    int version;

    version = number != null ? number.intValue() : 0;

【讨论】:

以上是关于Java JDBC 如何使用 RETURNING 语句处理更新查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 FORALL 和 RETURNING 插入表时如何获取 ROWID

如何在 DQL 中使用 RETURNING 更新查询

如何从另一个 php 文件中使用 PostgreSql 的 CURRVAL / RETURNING?

如何在 PostgreSQL 中使用 RETURNING 和 ON CONFLICT?

在 PHP 中,当将 PDO 与 pgSQL 一起使用时,如何在原始 INSERT sql 查询中获取“RETURNING”子句的值

PostgreSQL:帮助我了解RETURNING