我是Hibernate的新手,但是我有一个关于@Batchsize注解工作的问题。我知道它是如何工作的,但我不明白它是如何对实体id进行分组以进行选择的。例如,我有两个类: Car和Wheel。汽车有车轮列表,并且必须为空。我创建了10辆汽车--其中5辆有一个Wheel列表,另有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是如何选择id的for IN语句的?为什么不按ASC或DESC排序(例如- 1、2、3、4、5)?
发布于 2012-11-14 22:20:41
这是填充汽车列表的顺序。如果你想按id升序,你可以这样做:List<Car> cars = session.createQuery("from Car order by id asc").list();
发布于 2013-03-11 11:03:24
如果您关心汽车的顺序,那么,正如tibtof所提到的,只需修改原始查询以添加order by子句,这样您就可以按顺序迭代汽车。
如果您关心每个列表中控制盘的顺序(例如,对于Car1.getWheels(),Wheel1必须排在Wheel2之前),BatchSize不会为您提供排序选项。考虑将Wheel类设为Comparable,并添加一个方便的方法,如getSortedWheels()
public List<Wheel> getSortedWheels() {
List<Wheel> wheels = getWheels();
Collections.sort(wheels);
return wheels;
}https://stackoverflow.com/questions/13380461
复制相似问题