1

良い一日

ibatis を使用してマッピングしたい複雑なモデル (ddd) があります。

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

class A {
 int id;
 String title;
 List <B> b;
}

abstract class B {
 int id;
 String title;
 List <C> f;
 int type;
}

class BA extends B {

 BA() {
  setType(1);
 }
}

class BB extends B {

  BB {
   setType(2);
  }
}

私の現在の XML マッピング:

<sqlMap namespace="ABC">

  <resultMap id="aResult" class="A" groupBy="a_id">
    <result property="id" column=""a_id" />
    <result property="title" column="a_title" />
    <result property="b" resultMap="ABC.bResult" />
</resultMap> 

<resultMap id="bResult" class="java.util.HashMap">       
   <discriminator javaType="java.lang.Integer" column="b_type">
      <subMap value="1" resultMap="baResult" />
      <subMap value="2" resultMap="bbResult" />
   </discriminator>
</resultMap>

<resultMap id="baResult" class="BA">
  <result property="id" column="b_id" />
  <result property="title" column="b_title" />
</resultMap>

<resultMap id="bbResult" class="BB">
  <result property="id" column="b_id" />
  <result property="title" column="b_title" />
</resultMap>

<select id="aselect" resultMap="aResult">
select a.id as 'a_id', a.title as 'a_title', b.id as 'b_id', b.title as 'b_title', b.type as 'b_type'
from aa a left join bb b on a.id = b.aid
</select>

テーブル

aa (
id int not null primary key,
title varchar(50) not null
)

bb (
id int not null primary key,
aid int not null,
title varchar(50) not null
type int not null
)

継承は機能していますが、b はリストであり、b (BA、BB) には複数の行がありますが、A (ether BA または BB) イベントで 1 つしか返されません。

BA および BB クラスを使用する理由は、これらのクラスに個別のビジネス ロジックが含まれているためです (DDD に従って)。

Javaにibatis 2.3.4.726を使用しています

4

2 に答える 2

2

問題が見つかったと思います。マッピングが間違っています。これを試したとき:

<resultMap id="aResult" class="A" groupBy="id">

出来た。

于 2009-06-12T06:07:30.960 に答える
0

ヨハン、続けるのに十分な情報がないと思います。

SQL クエリを手動で実行すると、正確には何が得られますか?複数の結果行が得られますか? おそらく、実際には 1 つの結果行しか得られず、BA または BB のいずれかを含む List<B> を含む単一の A にマップされます。

このクエリで iBatis を呼び出すために使用する Java コードを教えてください。queryForObject() と言うと、最上位の A が 1 つだけ取得されますが、queryForList() は List<A> を取得します。これはあなたの問題のようには聞こえませんが、おそらく部分的な答えです。

SQL (カンマの欠落) と SQL マップ (二重の二重引用符) にエラーがありますが、これらは入力ミスだと思います。

あなたのJava結果オブジェクトはJavaBeansである必要があると私は信じています。したがって、上に示していないget/setメソッドが必要です。しかし、それが問題なら、データは返ってこないと思います。

于 2009-06-01T03:50:32.417 に答える