关于Hibernate Batchsize订购

时间:2012-11-14 14:13:07

标签: java sql hibernate batch-file

我是Hibernate的新手,但我对@Batchsize注释工作有疑问。我理解它是如何工作的,但我不明白它如何将实体id分组为select。例如 - 我有2个类:Car和Wheel。车有轮子清单,必须是空的。我创造了10辆汽车 - 其中5辆有车轮列表,其中5辆没有。然后我运行简单的代码

    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等。但我误解了--Hibernate如何为IN语句选择id?为什么它不是由ASC或DESC订购的(例如-1,2,3,4,5)?

2 个答案:

答案 0 :(得分:1)

这是车辆清单的填充顺序。如果您希望按ID升序,则可以执行以下操作:List<Car> cars = session.createQuery("from Car order by id asc").list();

答案 1 :(得分:0)

如果你担心汽车的顺序,那么,正如tibtof所提到的,只需修改原始查询即可添加order by子句,以便按顺序遍历汽车。

如果您担心每个列表中车轮的顺序(例如,对于Car1.getWheels(),Wheel1必须在Wheel2之前),BatchSize不会为您提供排序选项。考虑制作Wheel类Comparable并添加一个方便的方法,比如getSortedWheels()

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