子クラスのポリモーフィックな親を読み込めません。インクルードステートメントは違いがないようです。多相親のActiveJDBC eager loading
子供クラス:
@BelongsToPolymorphic(
parents = {ParentRequest.class},
typeLabels = {"parent_request"})
public class Child extends Model {
}
親クラス:熱心に子供+親を返す必要があります
public class ParentRequest extends Model {
}
問合せ:
List<Child> children = Child.where("... limit 500").include(ParentRequest.class);
children.size(); //this gives me 500
children.cachedParents.size(); //this gives me 0;
最終的に、私は次のことをスピードアップしようとしています操作:
for (Child child : children) {
ParentRequest pr = child.parent();
// lots of pr.getString("parent_field");
...
}
私はこれらの操作を抑制しており、上記の操作は.include(ParentRequest.class)がChild.where()メソッドで使用されているかどうかに関係なく約67ミリ秒かかると思われます。
洞察または助けがあれば幸いです。
注:子供には親が1人しかいないことを認識しています。近い将来、いくつかのことがあります。
編集: 何らかの理由で、クエリを反転すると、はるかに高速な結果が得られました。つまり、ParentRequestを検索してChildを検索した場合、子を探してParentRequestを含めずに、操作がはるかに高速でした。私はfindBySqlを使って、結果内のparent_requestテーブルに子テーブルを結合しました。以下では、クエリの詳細について説明しました。
List<ParentRequest> parents = ParentRequest.findBySQL("SELECT child.*, parent_requests.* " +
"FROM child JOIN parent_requests ON child.parent_id=parent_requests.id WHERE " +
"RAND()<=? AND (child.metersToA BETWEEN ? AND ?) " +
" AND (child.metersToB BETWEEN ? AND ?) limit ?",
decimation_value,
minDistanceToA, maxDistanceToA ,
minDistanceToB, maxDistanceToB,
MAX_POINTS).include(Child.class);
お返事ありがとうございました!メンバーのchildren.cachedParents.sizeはデバッガで見ることができるものなので、なぜ私はそれを持っているのか説明しません。何らかの理由で、私が検索を逆転させると、それは2つのテーブルを結合するクエリを実行し、インクルード(Child.class)でParentRequestを引き出すと、パフォーマンスが大幅に向上することがわかりました。上記の方法を照会すると、500ポイントを返すのに25-35秒かかりました。私がこのコメントで言及する方法を照会することで、12-15秒以内に500ポイントを返すことができました。私は下に私のpsudocodeを投稿します。 –
フレームワークが期待どおりに機能していることを嬉しく思っています(100回のうち99回がそうだと確信しています)。私は何が違うのだろうと思っています。 –
ロギングを有効にする:http://javalite.io/logging。あなたのケースでどのようなクエリが生成されるかを確認してください。その後、DBコンソールでこれらを手で実行し、説明を実行して、いくつかの理由が速い理由と他の原因が遅い原因を特定できます。 ActiveJDBCは単なるツールです - それはあなたにオプションを提供します:) – ipolevoy