Spring Data JPA - 该语句未返回结果集

Bob*_*ols 2 spring spring-data spring-data-jpa

在我的应用程序中,我有一个与父/子关系中的自身相关的模型.帖子可以有父母也是帖子.我写了一个查询来删除目标帖子及其后代.当我在Spring之外执行查询时,它完美地运行.但是,在Spring中运行它时,查询成功执行但抛出以下异常:

WARN  SqlExceptionHelper:144 - SQL Error: 0, SQLState: null
ERROR SqlExceptionHelper:146 - The statement did not return a result set.
ERROR [dispatcherServlet]:182 - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.orm.jpa.JpaSystemException: could not extract ResultSet; nested exception is org.hibernate.exception.GenericJDBCException: could not extract ResultSet] with root cause
com.microsoft.sqlserver.jdbc.SQLServerException: The statement did not return a result set.
Run Code Online (Sandbox Code Playgroud)

我的查询从扩展JpaRepository的接口运行

@Query(value = "WITH ParentTree AS (\n" +
            "  SELECT Parent.post_key,\n" +
            "    1 AS Level\n" +
            "  FROM community_post AS Parent\n" +
            "    WHERE Parent.post_key = ?1\n" +
            "    UNION ALL\n" +
            "      SELECT Child.post_key,\n" +
            "        pt.Level + 1\n" +
            "      FROM community_post AS Child\n" +
            "      INNER JOIN ParentTree AS pt\n" +
            "        ON Child.post_parent = pt.post_key\n" +
            "      WHERE Child.post_parent IS NOT NULL\n" +
            ")\n" +
            "DELETE FROM community_post\n" +
            "  WHERE post_key IN (\n" +
            "      SELECT post_key\n" +
            "      FROM ParentTree\n" +
            "  )", nativeQuery = true)
    void recursiveDelete(long targetKey);
Run Code Online (Sandbox Code Playgroud)

uni*_*eek 6

我想你也想添加@Modifying注释.请参阅此处的文档.这是因为SQL Delete不返回结果集.

编辑1:

如果您熟悉JDBC API,则归结为执行(或executeQuery)与executeUpdate.看起来Spring期望用@Query注释的方法将返回结果集,所以当它没有时它会失望.相关的问题/答案在这里.

  • `@Modifying` 和 `@Transactional` 起到了作用。非常感谢! (3认同)