在实际项目中我们经常会遇到一个实体中包含一个或多个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中

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐