resultMap中嵌套select语句查询子表中的列表

工作中我们常会碰到这样的需求:有一个主表和多个子表,我们需要对主表和子表进行关联条件查询,而子表又作为主表实体类中的一个属性。我们在利用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>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
如果您想查询一个表及其子对象,可以使用 MyBatis 的嵌套查询(Nested Query)功能,具体步骤如下: 1. 在 Mapper 接口定义查询方法,并使用 @ResultMap 注解指定结果映射关系。例如: ```java @Mapper public interface MyMapper { @Select("SELECT * FROM table WHERE id = #{id}") @Results(id = "resultMap", value = { @Result(property = "id", column = "id"), @Result(property = "name", column = "name"), // 其他字段... @Result(property = "subObjects", column = "id", many = @Many(select = "com.example.MyMapper.getSubObjects")) }) TableObject getTableObject(int id); @Select("SELECT * FROM sub_table WHERE table_id = #{tableId}") List<SubObject> getSubObjects(int tableId); } ``` 在上面的代码,我们定义了一个查询方法 `getTableObject`,它会查询名为 `table` 的表,并将查询结果映射为 `TableObject` 对象。我们使用 `@ResultMap` 注解指定了结果映射关系,其包括一个名为 `resultMap` 的 ID,以及一个包含了子对象映射的 `@Result` 注解。其 `many` 属性表示这是一个一对多的关系,我们将调用 `getSubObjects` 方法查询子对象并映射到 `subObjects` 属性上。 2. 在 `getSubObjects` 方法定义子查询语句,并返回查询结果。例如: ```java public List<SubObject> getSubObjects(int tableId) { String sql = "SELECT * FROM sub_table WHERE table_id = #{tableId}"; return sqlSession.selectList("com.example.MyMapper.getSubObjects", tableId); } ``` 3. 在代码调用 `getTableObject` 方法,并传递表 ID 参数。例如: ```java TableObject tableObject = myMapper.getTableObject(1); ``` 这样,我们就可以查询一个表及其子对象了。注意,上面的代码仅供参考,具体的 SQL 语句和结果映射关系需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小海海不怕困难

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值