M1.java を含むモデルが
@BelongsTo(foreignKeyName = "m2_id", parent = M2.class)
あり、M1 をロードした後
M2 myM2 = myM1.parent(M2.class)
、M2 オブジェクトを取得するために追加のクエリが作成されるとします (Hibernate FetchType.LAZY に似ています)。最初のクエリで JOIN を強制するにはどうすればよいでしょうか ( M1 オブジェクトをロードします)?
それが不可能な場合、または特定のケースで参加したくない場合、parent(M2.class)
クエリを再実行して M2 をロードするたびに呼び出しますか、それとも最初の「フェッチ」の後に M1 オブジェクトにキャッシュされますか?
ありがとう。
編集:
このページhttp://javalite.io/lazy_and_eagerinclude()
を見つけました。これは、メソッドを使用しない限り、親がキャッシュされないことを説明しています。
問題は、それを使用すると、1 つのクエリで親を選択するためのクエリがログに表示されますが、それらを 1 つずつ再度ロードするための追加のクエリが表示されることです。つまり、O(n+1) ではなく O(2) ではなく、O(n+2) です!
...
// Both test tables contain 1 row
List<M1> myM1s = M1.where(query, params).include(M2.class);
...
// Duplicating 3 times the print statement for test purpose
System.out.println(myM1s.get(0).parent(M2.class));
System.out.println(myM1s.get(0).parent(M2.class));
System.out.println(myM1s.get(0).parent(M2.class));
...
ログ
Query: "SELECT * FROM m1 WHERE...", with parameters:...
Query: "SELECT * FROM m2 WHERE id IN (1)"
Query: "SELECT * FROM m2 WHERE id = ?", with parameters: <1>
[print statement]
Query: "SELECT * FROM m2 WHERE id = ?", with parameters: <1>
[print statement]
Query: "SELECT * FROM m2 WHERE id = ?", with parameters: <1>
[print statement]
何が起こっている?