Как выбрать 10 случайных записей в JPQL?

Я должен выбрать случайные 10 записей из пользовательской таблицы,

Ниже приведен SQL-запрос, который дает случайные 10 записей.

 SELECT * FROM user_table ORDER BY RANDOM() LIMIT 10

Какова альтернатива JPQL для этого, есть ли у нас поддержка Random() для JPQL? Это хорошая практика для использования RANDOM()?

1 ответ

Решение

Я не знаю есть ли RANDOM в JPA. В качестве альтернативного решения вы можете использовать этот трюк:

Query queryCount = em.createQuery("SELECT COUNT(u) FROM UserTable u");
Long size = (Long) queryCount.getSingleResult();

//I use this way of Java8, you can use the way you see it better to generate random indexes
int[] index = new Random().ints(0, size, 10).toArray();

Query query = em.createQuery("SELECT u FROM UserTable u WHERE INDEX(u) IN :indexs");
                                                              ^^^^^^^^^^^^^^^^^^^
query.setParameter("indexs", index);
List<UserTable> listUsersRandom = query.getResultList();

Глобальная идея

Это решение основано на INDEX. Идея заключается в следующем:

  • Первый запрос - найдите размер ваших объектов
  • Создайте список индекса от 0 до size вашего списка
  • Второй запрос - выберите объекты, которые находятся в этом сгенерированном списке
Другие вопросы по тегам