1

我是 Hibernate 的新手,但我有一个关于 @Batchsize 注释工作的问题。我了解它是如何工作的,但我不明白它是如何对实体 ID 进行分组以供选择的。例如 - 我有 2 个课程:汽车和车轮。汽车有车轮列表,它必须是空的。我创建了 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 等。但我误解了 - 如何休眠选择 ID 的 IN 语句?为什么不按 ASC 或 DESC 排序(例如 - 1、2、3、4、5)?

4

2 回答 2

1

这是填充汽车列表的顺序。如果您想按 id 升序排列,您可以执行以下操作:List<Car> cars = session.createQuery("from Car order by id asc").list();

于 2012-11-14T14:20:40.937 回答
0

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

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

public List<Wheel> getSortedWheels() {
    List<Wheel> wheels = getWheels();
    Collections.sort(wheels);
    return wheels;
}
于 2013-03-11T03:03:24.023 回答