工作中我们常会碰到这样的需求:有一个主表和多个子表,我们需要对主表和子表进行关联条件查询,而子表又作为主表实体类中的一个属性。我们在利用sql查完主表后在在mybatis外部用sql再查询一遍子表再设置过于繁琐,因此我们可以在resultMap中嵌套子表的查询,进而简化原有繁琐的步骤。接下来我就介绍一下写法。
一、实体类
两个实体类的对应关系是这样的,一个用户对应多个订单,它们之间通过用户名进行关联。
用户实体类:
public class User {
private String name;
private List<Order> orders;
}
订单实体类:
public class Order{
private String userName;
private int money;
}
二、查询SQL语句
1、主表查询语句
<select id="queryUser" resultMap="userOrderMap">
select * from User where name = #{name}
</select>
2、子表查询语句
<select id="queryOrderByUserName" resultType="Order">
select * from Order where userName = #{name}
</select>
3、resultMap
注意这里collection 内的column的名称必须和外部需要传参的property的名称相一致才可以。
<resultMap id="userOrderMap" type="User ">
<result column="name" property="name"/>
<collection property="orders" ofType="Order" select="queryOrderByUserName"
column="name">
</collection>
</resultMap>