2015-08-17 108 views
1

使用休眠我帶來了樣本表ANIMALS的結果列表。 Hibernate的方法是這樣的:通過多個條件拆分列表

... 
List<Animals> animalList= null; 
     try { 
      Query query = session.createQuery("SELECT * FROM animals ORDER BY COLOR , HEIGHT , AGRESSIVE; "); 
      animalList= query.list(); 
     } 
... 

結果集的一個例子是以下幾點:

NAME COLOR HEIGHT AGRESSIVE 
--------------------------------- 
JIMMY BLACK SHORT NO 
RIPPER BLACK SHORT YES 
GOOFY BLACK TALL NO 
MURPHY BLACK TALL YES 
PAUL WHITE SHORT NO 
ROB  WHITE SHORT YES 
BOBBY WHITE TALL NO 
JACK WHITE TALL YES 

我的實際結果列表中有一個最低的10萬條記錄,從而解析列表,併爲執行list.add(..)每個人都不是很明智; 我想要做的是將結果集分成8個小列表,其中包含COLOR,HEIGHTAGGRESSIVE的各個組合。 之後,列表將作爲參數提供給方法以執行一系列操作。

我只能使用Java 1.6或更低版本。 我的主要目標是從IndexOutOfBounds措施,我把和IF's瘋狂ammount的像逃跑以下幾點:

for (int i = 0; i < animalList.size(); i++) { 
previousAnimal = animals.get(i-1); 
currentAnimal = animals.get(i); 
nextAnimal = animals.get(i+1); 
    ...//extra code 
    IF (previousAnimal.getColor() != currentAnimal.getColor() || previousAnimal.getHeight() != currentAnimal.getColor() || previousAnimal.getAgressive() != currentAnimal.getAgressive()) 
    ...//extra code 
    IF (currentAnimal.getColor() != nextAnimal.getColor() || currentAnimal.getHeight() != nextAnimal.getColor() || currentAnimal.getAgressive() != nextAnimal.getAgressive()) 
    ...//extra code 
+1

如果你使用Java 8,你可以使用Stream API來完成。如果您使用的是Java 7或之前的版本,請使用類似quaere或類似的庫 –

+0

過濾查詢,您可以使用Criteria of Criteria API – santiago92

+1

或者將所有內容放在'MultiMap'中,並使用屬性元組的鍵使用一致的'hascode()'方法。 – dotvav

回答

0

也許你可以使用DENSE_RANK分析功能,以確定具有相似特徵的動物:

... 
List<Animals> animalList= null; 
     try { 
      Query query = session.createQuery("SELECT a.*, DENSE_RANK() OVER (ORDER BY COLOR, HEIGHT, AGRESSIVE) GRP FROM animals a ORDER BY COLOR, HEIGHT, AGRESSIVE; "); 
      animalList= query.list(); 
     } 
... 

結果集的一個例子是如下:

NAME COLOR HEIGHT AGRESSIVE GRP 
------------------------------------- 
JIMMY BLACK SHORT NO   1 
RIPPER BLACK SHORT YES   2 
GOOFY BLACK TALL NO   3 
MURPHY BLACK TALL YES   4 
PAUL WHITE SHORT NO   5 
ROB  WHITE SHORT YES   6 
BOBBY WHITE TALL NO   7 
JACK WHITE TALL YES   8 

Wher e Color,HeightAggressive的每個不同組合將產生GRP列的不同值。那麼你可以簡化你的其他代碼:

for (int i = 0; i < animalList.size(); i++) { 
previousAnimal = animals.get(i-1); 
currentAnimal = animals.get(i); 
nextAnimal = animals.get(i+1); 
    ...//extra code 
    IF (previousAnimal.getGrp() != currentAnimal.getGrp()) 
    ...//extra code 
    IF (currentAnimal.getGrp() != nextAnimal.getGrp()) 
    ...//extra code