【问题标题】:Spring Boot: JPA QueryDSL: How to Make a Named Delete?Spring Boot:JPA QueryDSL:如何进行命名删除?
【发布时间】:2017-01-16 03:43:57
【问题描述】:

在 QueryDSL 存储库中,我可以这样进行命名查询:

public interface HistoricalDataRepository
    extends PagingAndSortingRepository<HistoricalData, Long>, 
            QueryDslPredicateExecutor<HistoricalData> {

    List<HistoricalData> findAll(Predicate predicate);

    HistoricalData findByKeyAndDate(String key, String date);

    @Query(value = "SELECT * FROM historical_data h WHERE "
        + " h.key = :key "
        + " AND h.date <= :date "
        + " order by date desc"
        + " limit 1"
        , nativeQuery = true)
    HistoricalData myFindByKeyLowerOrEqualToDate(
        @Param("key") String key
        , @Param("date") Date date
);

我该怎么做

DELETE FROM HISTORICAL_DATA;

如果我使用与上面相同的语法(使用@Queryannotation),我会得到一个异常:

org.springframework.orm.jpa.JpaSystemException: 
could not extract ResultSet; nested exception is 
org.hibernate.exception.GenericJDBCException: could not extract ResultSet

背景:我不想使用

historicalDataRepository.deleteAll();

因为它的性能非常低。

编辑:

我的语法如下所示:

@Query(value = "DELETE FROM HISTORICAL_DATA", nativeQuery = true)
void myDeleteAll();

【问题讨论】:

  • 如果您愿意从JpaRepository(扩展PagingAndSortingRepository)扩展您的存储库,JpaRepository 提供了一个deleteAllInBatch 方法。如果没有,请为您添加显示查询的方法添加代码。
  • 我添加了代码。
  • 您是否使用@Modifying@Transactional 标记了myDeleteAll 方法?请务必阅读 the official documentation 以了解可能会修改基础数据的查询的细微差别。
  • 我今天试图帮助某人解决这个问题。 @query 机制用于生成查询、行。它检查第一个 By 的方法签名,并使用剩余的签名生成一个 QUERY。 JPA 参考的第 4.4.2 节。
  • 对此持保留态度,但是:如果删除方法中存在错误,您如何恢复?或者你怎么知道的?一件事是电影列表中缺少一行,另一件事是删除了错误的用户。

标签: java hibernate spring-boot spring-data-jpa querydsl


【解决方案1】:

看起来,您正在结合 JPA 查询和本机查询。对于您给出的语法,您必须将其指定为原生,如下所示

@Query(value = "DELETE FROM HISTORICAL_DATA", nativeQuery = true)

【讨论】:

  • 这会导致问题中写的运行时错误。
猜你喜欢
  • 2014-05-30
  • 2012-07-25
  • 1970-01-01
  • 2013-04-25
  • 2014-12-11
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
相关资源
最近更新 更多