1

Hibernate は初めてですが、@Batchsize アノテーションの動作について質問があります。それがどのように機能するかは理解していますが、選択のためにエンティティ ID をグループ化する方法がわかりません。たとえば、車と車輪の 2 つのクラスがあります。車にはホイールのリストがあり、空でなければなりません。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 などを指定できます。しかし、私は誤解しています - どのように IN ステートメントの選択 ID を休止状態にしますか? 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句を追加するだけで、車を順番に繰り返すことができます。

各リストのホイールの順序が気になる場合(たとえばCar1.getWheels()、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 に答える