views:

958

answers:

2

Good day

I have a complex model (ddd) which i want to map using ibatis.

My model is as follows:

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

My current 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>

Tables

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
)

The inheritance is working but it only returns one in A (ether BA or BB) event though b is a list and there is multiple rows for b (BA, BB) Could you please help me?

The reason for using the BA & BB classes is that those contains the seperate businesss logic (as per DDD).

I am using ibatis 2.3.4.726 for java

A: 

Johan, I don't think there's enough information to go on.

What exactly do you get when you run the SQL query manually, do you get multiple result rows? Maybe you really are getting just one result row, which would map to a single A containing a List<B> with either a BA or a BB in it.

Can you show us the Java code you use to invoke iBatis with this query? If you say queryForObject() you'll get just one top level A, while queryForList() will give you a List<A>. This doesn't sound like your problem, but perhaps it's a partial answer.

There are errors in your SQL (missing comma) and your SQL Map (doubled double quotes), but I assume those are typing mistakes.

Your Java result objects I believe need to be JavaBeans, and therefore must have get/set methods, which you don't show above. But if that were the problem, I'd expect you to get no data back.

Jim Ferrans
+1  A: 

I think i found the problem, the mapping is wrong. When it tried this:

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

It worked.