【问题标题】:Could not extract ResultSet when performing customized native query执行自定义本机查询时无法提取 ResultSet
【发布时间】:2019-05-12 16:38:35
【问题描述】:

我正在使用 Spring Data JPA,我想封装一个执行特定 SQL 的方法。我在以下问题上这样做:

@Component
public interface UserRepository extends CrudRepository<User, String> {
  @Query(
      value = "delete from User u where u.alias = :alias",
      nativeQuery = true
      )
  void deleteUserByAlias(@Param("alias") String alias);
}

但是,我收到以下消息:

{
  "timestamp": "2018-12-11T15:54:54.627+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "could not extract ResultSet; nested exception is org.hibernate.exception.GenericJDBCException: could not extract ResultSet",
  "path": "/user/delete"
}

那么问题出在哪里?

【问题讨论】:

    标签: java spring spring-data-jpa


    【解决方案1】:

    检查您传递的参数不为空。它对我有用。

    【讨论】:

    【解决方案2】:
    @Repository
    @Transactional
    interface OrderRepository: JpaRepository<Order, OrderIdentity>{
    
       @Query("SELECT * FROM orders WHERE id=:id",nativeQuery = true)
       fun findBy(@Param("id") id: String): List<OrderEvent>
    
       @Modifying
       @Query("DELETE FROM orders WHERE id=:id", nativeQuery = true)
       fun deleteFor(@Param("id") id: String)
    
    }
    

    通过在方法上使用@Modifying 和在Repository 上使用@Transactional 错误将得到解决。

    【讨论】:

      【解决方案3】:

      如果您的方法已经是 Transactional ,那么请在存储库方法上也使用 transactional

      @Component
          public interface UserRepository extends CrudRepository<User, String> {
      
            @Query(
                value = "delete from User u where u.alias = :alias",
                nativeQuery = true
                )
            @Modifying
            @Transactional
            void deleteUserByAlias(@Param("alias") String alias);
          }
      

      【讨论】:

      • 感谢您的回答,但它对我不起作用。
      • 你在数据库中的表名是什么?
      • 谢谢@Modifying, @Transactional 方法解决了我的问题
      【解决方案4】:

      不直接回答我的问题,但找到了一种解决方法,可以根据其他属性而不是 ID 来删除记录。
      根据this thread的回答,

      支持使用给定方法名称派生删除查询 从 Spring Data JPA 的 1.6.0.RC1 版本开始。关键词 支持删除和删除。作为返回值,可以选择 在已删除实体的数量或列表之间。

      Long removeByLastname(String lastname);

      List deleteByLastname(String lastname);

      我会写

        @Transactional
        void deleteByAlias(String alias);
      

      UserRepository 实现目标。

      我不会接受这个答案,并愿意接受任何进一步的贡献。

      【讨论】:

        【解决方案5】:

        你的班级应该是这样的:

        @Component
        public interface UserRepository extends CrudRepository<User, String> {
        
          @Query(
              value = "delete from User u where u.alias = :alias",
              nativeQuery = true
              )
          @Modifying
          void deleteUserByAlias(@Param("alias") String alias);
        }
        

        如您所见,我正在使用@Modifying,有关更多信息,请查看https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.modifying-queries

        【讨论】:

        • 感谢您的回答,但根据您的建议,错误仍然存​​在。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-25
        • 2013-12-05
        • 1970-01-01
        • 2015-08-03
        • 2016-09-28
        • 2018-10-04
        相关资源
        最近更新 更多