Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring-JPA删除行数查询_Java_Mysql_Spring_Spring Mvc_Jpa - Fatal编程技术网

Java Spring-JPA删除行数查询

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

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

@Query("SELECT COUNT(*) FROM Tweetpost t")
int findRowCount();
使用int
findRowCount()我可以看到数据库中填充了多少行,现在我想删除所有超过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());
        ...
    }

}