2

iBatisを使用する既存のアプリにいくつかの新しい機能を追加しようとしていますが、設計上の決定の1つに少し行き詰まっています。

新しいフィールドを追加したい既存のクラス(クラスAと呼びます)があります。これらのフィールドはタイプBになります。

クエリは外部結合を介してBを結合します。

だからそれは次のようなものになります

public class A {

   //... existing fields
   private List<B> bList; // may use a Map rather than a list?

   // etc.
}

public class B {
   private int id; // primary key
   private int type;
   private String description;

   // etc.

}

私はこれをWebアプリで使用しています。最初のページで「A」のリストを返し、次にBの横にリンクを配置します。

例えば:

LinktoRecordA1 - LinktoB1 LinktoB2 LinktoB3
LinktoRecordA2 - LinktoB1          LinktoB3
LinktoRecordA3 - LinktoB1 LinktoB2 LinktoB3
LinktoRecordA4 

(注:レコードA4にはBへのリンクがないため、上記の外部結合)

「A」の最初のフェッチでは、Bレコードが存在することだけを知りたいのですが、その主キーは、B詳細レコードへのリンクを提示することです。だから私の問題は、「A」オブジェクトに「B」の完全に入​​力されたリストを作成せずにこれを行うにはどうすればよいですか?

4

1 に答える 1

0

あなたのコメントについて:

How else should I do it? I think what I'm having trouble understading is 
this- should I return a list of "A" objects with only minimal data 
populated, or would should I create some kind of new object?

あなたが説明したような状況 (リストが返され、ユーザーがそこから何かを選択できる場合) では、ユーザーは通常、詳細を表示するために 1 つまたは 2 つのレコードを選択することに気付きました。この場合、完全に取り込まれたオブジェクトのリストが無料で返されます。

その場合、私が行うことは、本格的なオブジェクトではなく、オブジェクト識別子のみを選択するようにフォールバックすることです。

したがって、このデータのみを使用して新しいクラスを作成できます。

public class C {
  private Integer idForA;
  private List<Integer> listOfIdsForB = new ArrayList<Integer>();
  //...
}

次に、外部結合を使用してクエリを記述し、A と B の識別子を返し、次のような結果を返します。

IDtoRecordA1 | IDtoB1 
IDtoRecordA1 | IDtoB2 
IDtoRecordA1 | IDtoB3

IDtoRecordA2 | IDtoB1          
IDtoRecordA2 | IDtoB3
IDtoRecordA3 | IDtoB1 

IDtoRecordA3 | IDtoB2 
IDtoRecordA3 | IDtoB3

IDtoRecordA4 | null

この段階で、タグのgroupBy属性は、これを含むオブジェクトのリストに結果を変換するのに便利です:resultMapC

C1: IDtoRecordA1, [IDtoB1, IDtoB2, IDtoB3]
C2: IDtoRecordA2, [IDtoB1, IDtoB3]
C3: IDtoRecordA3, [IDtoB1, IDtoB2, IDtoB3]
C4: IDtoRecordA4, []

これは、N+1 クエリを回避するのにも非常に役立ちます。B のリストを含む A オブジェクトを返すときに既にこれを行っている可能性がありますが、別のクエリを使用してリスト (つまりselect、タグの属性result) を取得している場合は、「N + 1 選択の回避」を参照することをお勧めします。 iBatis Data Mapper 開発者ガイドのセクションを参照して、データを返すために必要なクエリの数を最小限に抑えます。

要点は...

...大量のデータを処理する場合、少量の情報を表示するためだけに完全にロードされたオブジェクトを返すのは、おそらくやり過ぎです。

.. 一方、少量のデータを処理する場合、ID を処理する別のクラスを導入すると、おそらく事態が複雑になるため、A と B の完全なオブジェクトを返すこともできます (ただし、N+1 のクエリは避けます)。コース)。

于 2010-01-18T16:25:15.007 に答える