Java Spring数据JDBC@Modifying,使用PostgreSQL返回从修改的行返回数据

Java Spring数据JDBC@Modifying,使用PostgreSQL返回从修改的行返回数据,java,postgresql,spring-data-jdbc,Java,Postgresql,Spring Data Jdbc,PostgreSQL提供了一种从DML语句返回数据的简洁方法,请参见 我试图实现的是如下所示 @Modifying @Query("DELETE FROM Book b WHERE b.title = :title RETURNING *") Book deleteReturning(@Param("title") String title); 检索已删除的行。 但是,这会导致以下例外情况 org.springframework.dao.DataInte

PostgreSQL提供了一种从DML语句返回数据的简洁方法,请参见

我试图实现的是如下所示

@Modifying
@Query("DELETE FROM Book b WHERE b.title = :title RETURNING *")
Book deleteReturning(@Param("title") String title);
检索已删除的行。 但是,这会导致以下例外情况

org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [DELETE FROM Book b WHERE b.title = ? RETURNING *]; A result was returned when none was expected.; nested exception is org.postgresql.util.PSQLException: A result was returned when none was expected.
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:104)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
    at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1443)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:633)
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:862)
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:883)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:321)
    at org.springframework.data.jdbc.repository.query.AbstractJdbcQuery.lambda$createModifyingQueryExecutor$0(AbstractJdbcQuery.java:103)
    at org.springframework.data.jdbc.repository.query.StringBasedJdbcQuery.execute(StringBasedJdbcQuery.java:85)
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor$QueryMethodInvoker.invoke(QueryExecutorMethodInterceptor.java:195)
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:152)
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:130)
    ...
Caused by: org.postgresql.util.PSQLException: A result was returned when none was expected.
    at org.postgresql.jdbc.PgStatement.checkNoResultUpdate(PgStatement.java:269)
    at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:131)
    at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)
    at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)
    at org.springframework.jdbc.core.JdbcTemplate.lambda$update$0(JdbcTemplate.java:867)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:617)
    ... 95 more
SpringDataJDBC声明修改查询只能返回void、int和boolean,请参阅

添加自定义行映射器会导致相同的异常

    public class BookRowMapper<T> implements RowMapper<Book> {
        @Override
        public Book mapRow(final ResultSet rs, final int rowNum) throws SQLException {
            return new Book(rs.getString(1), ...);
        }
    }

    @Modifying
    @Query(value = "delete from Book b where b.title = :title returning *", rowMapperClass = BookRowMapper.class)
    Book deleteReturning(@Param("title") String title);
公共类BookRowMapper实现了RowMapper{
@凌驾
public Book mapRow(最终结果集rs,最终int rowNum)引发SQLException{
归还新书(rs.getString(1),…);
}
}
@修改
@查询(value=“从书b中删除,其中b.title=:title returning*”,rowMapperClass=BookRowMapper.class)
图书删除返回(@Param(“title”)字符串标题);
有没有办法实现这一目标


编辑:我知道普通JDBC,但我想采用Spring方式。

当您使用
@modify
注释方法时,它将作为DML语句执行,除了更新的行数之外,它不会返回任何值


如果您的语句返回一个
ResultSet
,则不应使用
@Modifying
,因此Spring Data JDBC尝试提取
ResultSet
,并从中为方法创建返回值。

谢谢。就像你描述的那样。但是,省略@Modifying真的没有负面的副作用吗?
@Modifying
会更改JDBC驱动程序上调用的方法和处理结果的方式。这就是全部。