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 つ入手します。
たとえば、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;
}