美好的一天
我有一个复杂的模型(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);
}
}
<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
答案 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方法,这些方法在上面没有显示。但如果这是问题,我希望你不会得到任何数据。