Критерии гибернации Запрос Случайный - PullRequest
1 голос
/ 16 января 2012

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

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

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

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

1 Ответ

1 голос
/ 16 января 2012

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

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

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

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

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

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