Критерии гибернации Запрос Случайный
У меня есть проект, использующий 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 отклонены идентификаторы уже загруженных вопросов.