2012-01-16 147 views
1

我有一个使用Hibernate的项目。 这有一个名为Question的类。 每个Question都有一个难度级别(1,2,3); 每个Question也有一个属性是字段(a,b,c,d,e,f,g,h,i,k);休眠标准查询随机

假设我有100个问题。我想与条件随机20问题:在水平

  • 7个问题中的1级
  • 7个问题中的3级
  • 每场2
  • 6个问题至少有1个问题

感谢所有^^

回答

1

首先,我觉得这个问题太难用一个Hibernate查询,邻来解决即使是一组Hibernate查询。

这是我会怎么做:

  • 装载在内存中的所有100个问题
  • 创建Map<Field, List<Question>>shuffle都在这个地图
  • 每个字段的名单,采取的第一个问题对应的列表具有可接受的级别
  • 一旦您在每个字段中都有一个问题,就把所有剩下的问题放在一个列表中,随机播放列表并遍历列表。每次问题的级别都可以接受时,请接受。那样做直到你有20个问题。

如果对于每个字段,保证每个级别至少有一个问题,这应该有效。如果情况并非如此,那就更困难了。

如果您有更多的问题是100,他们不能加载到内存中,你可以使用同一种算法,而是使用random queries选择问题:

  • 问题每一个查询字段在每个字段中查找问题。 where子句只能接受给定的字段,并且只应接受仍然可以接受的级别。
  • 发出一个查询随机查找N个问题(例如,N等于50,并且使用where子句只接受剩余的级别),并获取前10个可接受的问题。如果少于10个可接受的问题,请再试一次。最多应该有3个这样的查询。确保你的where子句拒绝已经加载的问题的ID。
+0

我认为我们可以从集合中删除步骤3中选定的问题,所以我们不必在步骤4中重新洗牌集合;如果不仅有100个问题,而且我们无法将所有这些问题都加载到内存中呢? – user1151484 2012-01-16 10:01:07

+0

第4步的要点是将所有剩余的问题,无论他们的字段是什么,放在同一个列表中。如果你不洗牌这个列表,你会发现给定字段的所有问题组合在一起。我将编辑关于最后一点的问题。 – 2012-01-16 10:07:03