Критерии гибернации Запрос Случайный

У меня есть проект, использующий Hibernate. Это имеет класс с именем Question, каждый Question имеет уровень сложности (1,2,3); каждый Question также имеет атрибут field (a,b,c,d,e,f,g,h,i,k);

Предположим, у меня есть 100 вопросов. Я хочу получить случайно 20 вопросов с условиями:

  • 7 вопросов на уровне 1
  • 7 вопросов на уровне 2
  • 6 вопросов на уровне 3.
  • В каждом поле есть как минимум 1 вопрос

Спасибо всем ^^

1 ответ

Решение

Прежде всего, я думаю, что эту проблему слишком сложно решить, используя запрос Hibernate или даже набор запросов Hibernate.

Вот как бы я это сделал:

  • загрузить все 100 вопросов в память
  • создать Map<Field, List<Question>>и перемешать все списки на этой карте
  • для каждого поля возьмите первый вопрос соответствующего списка, который имеет приемлемый уровень
  • Когда у вас есть один вопрос в каждом поле, возьмите все оставшиеся вопросы, поместите их в список, перетасуйте список и переберите список. Каждый раз, когда вопрос имеет приемлемый уровень, принимайте его. Делайте это, пока у вас нет 20 вопросов.

Это должно работать, если для каждого поля вы гарантированно зададите хотя бы вопрос для каждого уровня. Если это не так, то это сложнее.

Если у вас гораздо больше вопросов, чем 100, и они не могут быть загружены в память, вы можете использовать тот же тип алгоритма, но использовать случайные запросы для выбора вопросов:

  • введите один запрос для каждого поля, чтобы найти вопрос в каждом поле. Предложение where должно принимать только данное поле и только те уровни, которые по-прежнему приемлемы.
  • введите запрос для случайного поиска N вопросов (например, с N равным 50 и с предложением where, которое принимает только остальные уровни), и возьмите первые 10 приемлемых вопросов. Если есть менее 10 приемлемых вопросов, попробуйте еще раз. Таких запросов должно быть не более 3. Убедитесь, что в предложении where отклонены идентификаторы уже загруженных вопросов.
Другие вопросы по тегам