使用Spring数据JPA获取随机记录

SPS*_*SPS 15 spring hibernate jpa spring-data spring-data-jpa

我想使用Spring数据JPA获取随机记录.我正在使用@Query.但这需要很长时间.

@Query("select que from Question que order by RAND()")
public List<Question> findRandamQuestions();
Run Code Online (Sandbox Code Playgroud)

这样做的有效方法是哪种?请帮忙!

小智 22

问题select que from Question que order by RAND()是您的数据库将在返回一个项目之前订购所有记录.所以它在大型数据集中很昂贵.

实现这一目标的更便宜的方法包括两个步骤:

  1. 查找您将从中选择一个的记录总数.
  2. 获取此集中的一个随机项.

例如,要在MySql中执行此操作,您可以执行以下操作:

select count(*) from question;

// using any programming language, choose a random number between 0 and count-1 (let's save this number in rdn), and finally

select * from question LIMIT $rdn, 1;
Run Code Online (Sandbox Code Playgroud)

好的,但要在spring数据中执行此操作,您需要创建一些本机查询...

幸运的是,我们可以使用分页来解决这个问题.在您的存储库接口中,创建方法(某些存储库具有此功能而无需定义它):

Long count(); 
Page<Question> findAll(Pageable pageable);
Run Code Online (Sandbox Code Playgroud)

在您的服务中,您可以通过以下方式使用您的存储库:

public Question randomQuestion() {
    Long qty = questionRepository.countAll();
    int idx = (int)(Math.random() * qty);
    Page<Question> questionPage = questionRepository.findAll(new PageRequest(idx, 1));
    Question q = null;
    if (questionPage.hasContent()) {
        q = questionPage.getContent().get(0);
    }
    return q;
}
Run Code Online (Sandbox Code Playgroud)

  • new PageRequest() 现已弃用。User PageRequest.of(idx, 1) 作为参数 (2认同)