我有一个带有JPARepository的Spring Boot应用程序来管理MySQL数据库中的数据。目前我有这个查询注释:
@Query("SELECT COUNT(*) FROM Tweetpost t")
int findRowCount();
使用int findRowCount();
我可以看到在DB中填充了多少行,现在我想要删除所有超过100的行。所以数据库不应该超过100行,否则应该删除一切都在100以上。我只有这个:
@Modifying
@Transactional
@Query(DELETE)
int removeOldRows();
答案 0 :(得分:2)
不幸的是,JPQL无法使用limit
关键字。但是你可以分两步完成。首先 - 获取最新ID的有限列表。第二 - 删除所有推文,这些推文不在此列表中。我想,既然你想要删除最旧的记录,那么就有date
列。
在存储库中声明两种方法:
@Repository
public TweetpostRepository extends CrudRepository<Tweetpost , Integer>{
@Query("select t.id from TweetPost t order by t.date desc")
public Page<Integer> findLatestId(Pageable pageable);
@Modifying
@Transactional
@Query("delete from TweetPost t where t.id not in (:idList)")
public void deleteByExcludedId(@Param("idList") List<Integer> idList);
...
}
请注意,我们使用desc
排序,因为我们需要最新记录的ID。现在您可以在Controller中使用它:
@Service
public class MyService {
@Autowired
private TweetpostRepository repository;
public void trunkateTweetposts(){
Page<Integer> page = repository.findLatestId(new PageRequest(0, 10));
repository.deleteByExcludedId(page.getContent());
...
}
}
在此示例中,10
是您希望保留的记录数。