在实际项目中我们经常会遇到一个实体中包含一个或多个List子对象,当进行查询时,可以采用以下两种方式:
1、一次查询
比如该对象中有以下三个List需要查询
如果项目能够支持一次查询,最好用一次查询,省事,效率也高
直接使用<collection/>标签,其中property为要查询的list名称,ofType为List里存放的类型。
<result column="position" property="position"/>
把查询到的字段放<result/>标签中即可。
查询语句使用left join关联查询
这样就可以一次完成子表查询,即可查询到VO中的所有字段。
2、分步查询
分步查询有两种处理方式:一是通过mapper.xml直接分步查询;另外一种是分别在不同mapper.xml中查询子对象,再通过java遍历封装到实体中。这两种方式的选择,需要看项目的支持程度。
2.1、通过mapper.xml直接分步查询
比如该对象中有以下两个List需要查询
现在通过mapper.xml直接分步查询,看以下写法:
可以看到也是使用<collection/>标签,其中property为List对象的名字,重点解释下column这个用法
column="{expenseId=id}" 可以简写为 column="id"
id为要关联主表中的id字段,expenseId为子表中与主表关联的字段。相当于 主表left join 子表 on 主表字段=子表字段。这个column在子表中用法见下图
select="com.hnlrkj.office.mapper.expenses.ExpensesDetailMapper.getExpensesDetail"/>
select 字段则关联子表中查询语句的id名,这里需要写全名。以下是子表中的查询id名。
主表查询语句,只需要通过主表的条件,查询主表中想要的字段,再通过刚才的分步子查询,即可查询到VO中的所有字段。
2.2 、分别在不同mapper.xml中查询子对象,再通过java封装到实体中
这种方式的原理就是先分别调用sql查询子对象,再把查询到的子对象通过java存放到VO中