Ibatis继承和一对多

时间:2009-05-28 08:26:48

标签: inheritance ibatis

美好的一天

我有一个复杂的模型(ddd),我想用ibatis进行映射。

我的模型如下:

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 Mapping:

<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
)

继承正在工作,但它只返回A(以太网BA或BB)事件中的一个,尽管b是一个列表,并且b(BA,BB)有多行 你能帮我吗?

使用BA&amp; BB类是那些包含单独业务逻辑的(根据DDD)。

我正在使用ibatis 2.3.4.726 for java

2 个答案:

答案 0 :(得分:2)

我想我发现了问题,映射是错误的。当它尝试这个:

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

有效。

答案 1 :(得分:0)

约翰,我认为没有足够的信息继续下去。

当您手动运行SQL查询时,您获得了多少结果行?也许你真的只得到一个结果行,它将映射到包含List&lt; B&gt;的单个A。其中包括BA或BB。

您能告诉我们您使用此查询调用iBatis的Java代码吗?如果你说queryForObject()你只会得到一个顶级A,而queryForList()会给你一个List&lt; A&gt;。这听起来不像你的问题,但也许这是一个部分答案。

您的SQL(缺少逗号)和SQL Map(加倍双引号)中存在错误,但我认为这些错误是在输入错误。

我认为你的Java结果对象需要是JavaBeans,因此必须有get / set方法,这些方法在上面没有显示。但如果这是问题,我希望你不会得到任何数据。