Java Spring-JPA删除行数查询
我有一个SpringBoot应用程序,它带有一个JPARepository来管理MySQL数据库中的数据。目前我有这个查询注释:Java Spring-JPA删除行数查询,java,mysql,spring,spring-mvc,jpa,Java,Mysql,Spring,Spring Mvc,Jpa,我有一个SpringBoot应用程序,它带有一个JPARepository来管理MySQL数据库中的数据。目前我有这个查询注释: @Query("SELECT COUNT(*) FROM Tweetpost t") int findRowCount(); 使用intfindRowCount()我可以看到数据库中填充了多少行,现在我想删除所有超过100行的行。所以数据库的行数不应该超过100行,否则它应该删除100行以上的所有行。我只有这个: @Modifying @Transactional
@Query("SELECT COUNT(*) FROM Tweetpost t")
int findRowCount();
使用intfindRowCount()代码>我可以看到数据库中填充了多少行,现在我想删除所有超过100行的行。所以数据库的行数不应该超过100行,否则它应该删除100行以上的所有行。我只有这个:
@Modifying
@Transactional
@Query(DELETE)
int removeOldRows();
不幸的是,JPQL不能使用limit
关键字。但是你可以分两步来做。第一个-获取最新id的有限列表。第二个-删除所有推文,这些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);
...
}
在本例中,10
是您希望保留的记录数。那么这里的问题是什么?您将如何定义,哪些行已被删除?它应该是最旧的行,还是具有特定字段最小值的行?仅是最旧的行。因此,如果我在数据库中有105条记录,它应该删除最旧的5条。JQL中没有行限制,您可以使用spring JPA并创建一个名为simpler to findTop100OrderById的方法,这将返回一个列表,然后您必须迭代列表并删除每个实体。顺便说一句,有点离题,但是您的int findRowCount()代码>方法可以替换为count()
代码中有一些错误。在回购协议中,你写的“最新”带有两个T,在控制器中,你的意思是“公共无效”,我想。@julien thanx,我更正了拼写错误。我认为控制程序中的方法将返回重定向字符串。例如,重定向回列表视图。但是,当然,如果您不需要它,您可以使用public void
。如果您使用ajax.no执行此场景,它应该只属于后端,在那里我有一个内务服务,“观察”数据库。@julien,哦,我明白了。那么它应该是服务的方法,而且实际上是公开无效的。
@Service
public class MyService {
@Autowired
private TweetpostRepository repository;
public void trunkateTweetposts(){
Page<Integer> page = repository.findLatestId(new PageRequest(0, 10));
repository.deleteByExcludedId(page.getContent());
...
}
}