【发布时间】: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