Spring Data JPAを使用してランダムレコードを取得する 質問する

Spring Data JPAを使用してランダムレコードを取得する 質問する

Spring Data JPA を使用してランダム レコードを取得したいです。そのために @Query を使用していましたが、時間がかかりすぎています。

@Query("select que from Question que order by RAND()")
public List<Question> findRandamQuestions();

同じことを行うための効率的な方法はどれですか? 助けてください!

ベストアンサー1

問題はselect que from Question que order by RAND()、DB が 1 つの項目を返す前にすべてのレコードを並べ替えることです。そのため、大規模なデータ セットではコストがかかります。

この目標を達成するためのより安価な方法は、次の 2 つのステップで構成されます。

  1. 選択するレコードの合計数を検索します。
  2. このセットからランダムにアイテムを 1 つ入手します。

たとえば、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;

わかりました。ただし、Spring Data でこれを行うには、ネイティブ クエリをいくつか作成する必要があります...

幸いなことに、ページネーションを使用してこれを解決できます。リポジトリ インターフェースで、メソッドを作成します (一部のリポジトリでは、これを定義する必要はありません)。

Long count(); 
Page<Question> findAll(Pageable pageable);

サービスでは、次の方法でリポジトリを使用できます。

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;
}

おすすめ記事