Hibernate条件查询随机

Hibernate条件查询随机,hibernate,random,criteria,Hibernate,Random,Criteria,我有一个使用Hibernate的项目。 这有一个名为Question的类。 每个问题都有一个难度等级(1,2,3); 每个问题还有一个属性is field(a、b、c、d、e、f、g、h、i、k) 假设我有100个问题。我想随机得到20个有条件的问题: 第1级中的7个问题 第2级中的7个问题 第三级有6个问题 每个字段至少有一个问题 首先,多亏了all^^,我认为使用Hibernate查询甚至一组Hibernate查询都很难解决这个问题 我会这样做: 在内存中加载所有100个问题 创建一个

我有一个使用Hibernate的项目。 这有一个名为
Question
的类。 每个
问题
都有一个难度等级(1,2,3); 每个
问题
还有一个属性is field(a、b、c、d、e、f、g、h、i、k)

假设我有100个问题。我想随机得到20个有条件的问题:

  • 第1级中的7个问题
  • 第2级中的7个问题
  • 第三级有6个问题
  • 每个字段至少有一个问题

首先,多亏了all^^

,我认为使用Hibernate查询甚至一组Hibernate查询都很难解决这个问题

我会这样做:

  • 在内存中加载所有100个问题
  • 创建一个
    映射
    ,以及该映射中的所有列表
  • 对于每个字段,回答相应列表中具有可接受级别的第一个问题
  • 一旦你在每个领域都有一个问题,就把剩下的所有问题都列在一个列表中,重新排列列表,然后迭代列表。每当一个问题有一个可以接受的水平时,就接受它。直到你有20个问题为止
如果每个领域都保证每个级别至少有一个问题,那么这应该是可行的。如果不是这样,那就更难了

如果您有超过100个的问题,并且这些问题无法加载到内存中,您可以使用相同的算法,但用于选择问题:

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

首先,我认为使用Hibernate查询甚至一组Hibernate查询都很难解决这个问题

我会这样做:

  • 在内存中加载所有100个问题
  • 创建一个
    映射
    ,以及该映射中的所有列表
  • 对于每个字段,回答相应列表中具有可接受级别的第一个问题
  • 一旦你在每个领域都有一个问题,就把剩下的所有问题都列在一个列表中,重新排列列表,然后迭代列表。每当一个问题有一个可以接受的水平时,就接受它。直到你有20个问题为止
如果每个领域都保证每个级别至少有一个问题,那么这应该是可行的。如果不是这样,那就更难了

如果您有超过100个的问题,并且这些问题无法加载到内存中,您可以使用相同的算法,但用于选择问题:

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

我认为我们可以从集合中删除步骤3中选择的问题,这样我们就不必在步骤4中重新洗牌集合;如果不是只有100个问题,我们无法将它们全部加载到内存中呢?第4步的重点是将所有剩余的问题,不管它们的字段是什么,放在同一个列表中。如果不洗牌此列表,您将发现给定字段的所有问题都分组在一起。我将编辑关于最后一点的问题。我认为我们可以从集合中删除步骤3中选择的问题,这样我们就不必在步骤4中重新洗牌集合;如果不是只有100个问题,我们无法将它们全部加载到内存中呢?第4步的重点是将所有剩余的问题,不管它们的字段是什么,放在同一个列表中。如果不洗牌此列表,您将发现给定字段的所有问题都分组在一起。我将编辑关于最后一点的问题。