Spring JPA使用RowCount删除查询

时间:2016-02-16 13:02:15

标签: java mysql spring spring-mvc jpa

我有一个带有JPARepository的Spring Boot应用程序来管理MySQL数据库中的数据。目前我有这个查询注释:

@Query("SELECT COUNT(*) FROM Tweetpost t")
int findRowCount();

使用int findRowCount();我可以看到在DB中填充了多少行,现在我想要删除所有超过100的行。所以数据库不应该超过100行,否则应该删除一切都在100以上。我只有这个:

@Modifying
@Transactional
@Query(DELETE)
int removeOldRows();

1 个答案:

答案 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是您希望保留的记录数。