java - 无法使用 INSERT 从 Spring Data Repository 返回本机查询
问题描述
我在 Spring Data JPA 存储库中使用本机 SQL 查询,并希望在 upsert 后返回自动生成的 id。看起来像下面的类似片段:
public interface EntityRepository extends CrudRepository<Entity, Integer> {
@Modifying
@Transactional
@Query(value = "INSERT INTO entity (name, age) VALUES(?1,?2) " +
"ON CONFLICT(name) DO UPDATE SET name=?1,age=?2 " +
"RETURNING id", nativeQuery = true)
Integer upsert(String name, int age);
}
执行后我得到下一个 PSQLException:
Caused by: org.postgresql.util.PSQLException: A result was returned when none was expected.
at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:141)
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:175)
所以,问题就在这里:
org.postgresql.jdbc.PgPreparedStatement:
public int executeUpdate() throws SQLException {
executeWithFlags(QueryExecutor.QUERY_NO_RESULTS);
ResultWrapper iter = result;
while (iter != null) {
if (iter.getResultSet() != null) {
throw new PSQLException(GT.tr("A result was returned when none was expected."),
PSQLState.TOO_MANY_RESULTS);
}
iter = iter.getNext();
}
return getUpdateCount();
}
如果我可以设置另一个 QueryExecutor 标志或使用Statement.RETURN_GENERATED_KEYS
. 但现在似乎没有办法从 Spring Data Repository 中指定它。我知道我可以从存储过程中做我想做的事情,但它不像注释中的某些参数那么方便。
所以你怎么看?是否应将其视为 Spring Data & Postgres JDBC 中的错误?
UPD:打开 Jira 问题 - https://jira.spring.io/browse/DATAJPA-1389
解决方案
推荐阅读
- dictionary - 为什么 Julia 的 Dict{String, Any} 不接受“任何”值
- git - GitLab 将请求限制为单个 TLD
- microsoft-graph-api - 从可配置选项卡撰写 Microsoft Teams 消息
- elasticsearch - 带有条件的 Elasticsearch 子聚合
- python - 如何将一个数据框中的每个值连接到另一个数据框中的每一行?
- c# - 如何将获取多个表的ExecuteQuery左连接映射到一个类
- django - GCE 上的 Docker 总是重启
- r - unzGetCurrentFileInfo 中的 zipfile 错误 -103
- sql-server - 实体框架扩展递归查询
- javascript - 加载 NPM 模块所需的最少工具