2012-01-16 148 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