首页 > 解决方案 > 无法使用 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

标签: javapostgresqlspring-data-jpa

解决方案


推荐阅读