2012-11-14 66 views
1

我是Hibernate的新手,但是我有一個關於@Batchsize註釋工作的問題。我明白它是如何工作的,但我不明白它如何將select實體ID分組。例如 - 我有兩個類:汽車和車輪。汽車有車輪列表,它必須是空的。我創造了10輛車 - 其中5輛車有一個輪子清單,其中5個沒有。然後我運行簡單的代碼關於Hibernate批量大小訂購

List<Car> cars = session.createQuery("from Car").list(); 
    for (Car car : cars) { 
     List<Wheel> wheels = car.getWheels(); 
     for (Wheel wheel : wheels) { 
      System.out.println(wheel.getTitle()); 
     } 
    } 

之後,我看到這樣的事情在我的控制檯:

Hibernate: 
select 
    wheels0_.car_id as car3_1_, 
    wheels0_.id as id1_, 
    wheels0_.id as id0_0_, 
    wheels0_.title as title0_0_ 
from 
    Wheel wheels0_ 
where 
    wheels0_.car_id in (
     ?, ?, ?, ?, ? 
    ) 
17:50:35,505 TRACE LongType:151 - binding '25' to parameter: 1<br> 
17:50:35,505 TRACE LongType:151 - binding '18' to parameter: 2<br> 
17:50:35,505 TRACE LongType:151 - binding '17' to parameter: 3<br> 
17:50:35,506 TRACE LongType:151 - binding '20' to parameter: 4<br> 
17:50:35,506 TRACE LongType:151 - binding '23' to parameter: 5<br> 

但下一次我得到別人的綁定。它可以是1,15,23和其他。但我誤解 - 如何休眠選擇ID的IN語句?爲什麼它不是由ASC或DESC命令(例如 - 1,2,3,4,5)?

回答

1

這是汽車列表填充的順序。如果你想通過id升序,你可以這樣做:List<Car> cars = session.createQuery("from Car order by id asc").list();

0

如果你關心汽車的順序,那麼,就像tibtof提到的那樣,只需修改原來的查詢來添加一個order by子句,以便遍歷汽車爲了。

如果您關心每個列表中Wheels的順序(例如,對於Car1.getWheels(),Wheel1必須在Wheel2之前出現),BatchSize不會爲您提供排序選項。考慮讓你的輪類Comparable,並添加一個方便的方法,如getSortedWheels()

public List<Wheel> getSortedWheels() { 
    List<Wheel> wheels = getWheels(); 
    Collections.sort(wheels); 
    return wheels; 
}