1

私のDBモデルは次のとおりです。

A.id (1 : n) B.ad_id

したがって、オブジェクトのカイエンでは、この特定の A エントリから B のすべてのエントリを返すA aことができます。a.getBArray()それでも、プロパティに基づいて、このリストをフィルタリングしたいと思いますactive = 1

明らかに で使用できますExpression.fromString("active = 1")SelectQuery、このアプローチでは、このクエリを実行する A インスタンスを関連付ける方法がわかりません。

別のアプローチは、 からすべてのエントリを取得しa.getBArray()、 を持つものだけを検索するコードでフィルタリングすることですactive == true。このアプローチは私見では非効率的です。

推奨事項は大歓迎です。

ありがとう、マキシム。

- 編集:

私の現在の解決策は次のとおりです(オブジェクト名はそれぞれaとbに置き換えられています):

long aId = DataObjectUtils.longPKForObject(db_a_instance);
String bSQL = "select * from b where active = 1 and a_id = " + aId;
SQLTemplate bQuery = new SQLTemplate(B.class, bSQL);
List<B> dbBs = context.performQuery(bQuery);

より良い、よりエレガントな解決策があるかどうか尋ねていますか?

ありがとう。

4

1 に答える 1

2

私はカイエンのフレンドリーなメーリングリストで同様の質問をしました。あなたはここで見ることができます。

リレーションシップが非常に大きなデータを返さない限り、リレーションシップを経由してJavaでフィルター処理するのが好ましいアプローチのようです。完全なリストがメモリに保存され、次にリレーションシップを使用するときにDBにアクセスする必要がないようにすることの利点。

答えはここに引用されています

どちらもDBにアクセスする必要があります。

  1. (トラバースインリレーションシップアプローチ)DBからグループに障害を発生させるには、DBに1回アクセスする必要がありますが、その後はメモリに保存されます。

  2. (フィルターアプローチを使用したクエリ)は、毎回DBにアクセスする必要があるため、返される一致が少なくても、長期的には遅くなる可能性があります。

これが1回だけ発生し、パフォーマンスについて本当に心配している(そしておそらくグループがたくさんある)場合は、#2を使用します。それ以外の場合は、#1を使用します。#1も少し最適化できるので、チェックするたびに繰り返す必要はありません。

経由:マイケルジェントリー

于 2011-01-24T17:34:34.223 に答える