3

私はこのようなPOJOを持っています

class foo
{
private String id;
private String attribute;
private Map<String, String> dataMap;
}

そして、私のデータモデルは

Table Item
- INT id
- CHAR attribute

// dataMap をキーと値のペアとして保存

Table Data
- INT id
- CHAR key
- CHAR value

今、私は以下の2つのクエリを組み合わせたい

最初のクエリ:

@Select("select * from Item where attribute=#{attribute}"
public List<Item> getItemList(@Param("attribute") String attribute);

指定された ID のすべてのキーと値のペアを取得する別のクエリ

指定された属性で ID のリストを取得し、ネストされたオブジェクト (dataMap) を設定する単一のクエリを作成する方法

// @Results、@Result ..

4

1 に答える 1

9

この種の状況は、myBatis では 2 つの方法で解決できます。

  • ネストされた選択 - アイテムのリストを取得し、それぞれに対して個別の選択を実行してデータを取得します。
  • ネストされた結果 - 単一の結合クエリを実行して関連付けられたデータを含むアイテムを取得し、myBatis に結果内の繰り返しサブセットを処理させます。

最初のオプションはパフォーマンスが非常に悪く、「n+1 選択問題」と呼ばれるものを引き起こします。2番目の方法は、この種のことを行うための推奨される方法です。

MyBatis ユーザー ガイドには、ネストされた結果を使用した例が含まれていますが、これは XML 構成用です。Java アノテーションにはいくつかの制限がありますが、理論的には可能であるはずです (私は Java コードで選択するのが好きではないため、id を試したことはありませんが、次の記事に役立つ情報がいくつかあります: IBatis (MyBatis): 結合の処理: 高度な結果マッピング、関連付け、コレクション、N+1 問題を選択)。

于 2012-07-15T16:08:00.280 に答える