日期:2014-05-20  浏览次数:20781 次

ibatis resultmap嵌套查询 空值如何处理
问题描述如下:
tableA
aid(not null) acol1 acol2
1 AAA AAA
2 AAAA AAAA
3 AAAAA AAAAA

tableB
bid(not null) aid(not null) bcol1 bcol2
1 1 b11 b12
2 2 b21 b22 

pojo对象如下:
public class TableA implements Serializable {
  private int aid;
  private String acol1;
  private String acol2;
  private List<TableB> tablebList;
}

现在想在sqlmap中进行配置,希望查询tableA记录的时候顺便把与tableA记录相关的tableB记录一起查询出来放到TableA对象的属性tablebList当中。配置如下:
<resultMap id="TableA-Result-List" class="tablea" groupBy="aid">
  <result property="aid" column="aid"/>
  <result property="acol1" column="acol1"/>
  <result property="acol2" column="acol2"/>
  <result property="tablebList" resultMap="TableB-Reslut-List"/>  
</resultMap>
这里是想让执行查询语句的时候自动把属于aid的tableb的记录直接被赋值到tablebList属性中。

由于实际情况是tableA中的记录可能在tableB中并无对应的记录,为了保证tableA的记录全部要查出来,所以查询用了左连接:
  <select id="getAbs" resultMap="TableA-Result-List">
  select a.*, b.* FROM tableA a left JOIN tableB b
  on b.aid=a.aid
  </select>

问题出现了,左连接查询的结果包括如下一条记录:

aid acol1 acol2 bid aid1 bcol1 bcol2
3 AAAAA AAAAA null null null null

即aid=3的记录在tableB中并无对应的记录,而tableB的bid又是不允许为空的!所以导致ibatis为tablebList属性赋值TableB对象时报了不允许为null的错误。

请问大家要想达到我希望的效果(tableA记录全部取出来,并且一次把属于tableA记录的tableB记录也查出来放到TableA对象的tablebList属性中,但是有可能出现空值无法赋值的问题),应该如何在ibatis中进行配置?


------解决方案--------------------
我现在用的iBATIS和 PostgreSQL,
在postgre里,我抽出对象的时候可以写成
null::varchar

你用的应该是Oracle吧,你要不用nvl(,)把他填上值
------解决方案--------------------
不要这么查
------解决方案--------------------
你可以不在ibatis这样设置,你pojo里面添加了tableblist,在你的Dao实现类的查询语句里面写几句代码查出tableb的信息,再set到你的tablea里,拙见仅供参考