02 Mybatis-Plus collection标签嵌套查询(select)的写法

1.问题描述:

前置:
在association标签中 javaType属性指向的是实体类的属性。
在collection标签中 javaType属性指向的是集合的类型 ofType指向的是集合的泛型类型 。
mybatis-plus selectPage与一对多查询时存在问题。
1.1实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("sys_class")
public class ClassInfo {

    @TableId(type = IdType.AUTO)
    private Integer id;
    private String grade;
    private String className;
    private String classNickname;
    private String ratedNum;

    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date createTime;  //创建时间

    @TableField(fill = FieldFill.UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date updateTime;  //更新时间

    @TableField(exist = false) // 属性字段在表中不存在
    private List<Student> studentList;      //该班级的学生
    @TableField(exist = false) // 属性字段在表中不存在
    private List<Teacher> teacherList;      //管理该班级的教师
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("sys_student")
public class Student {

    @TableId(type = IdType.AUTO)
    private Integer id;
    private String name;
    private String username;
    private String password;
    private SexEnum sex;
    private Date birth;
    private Date schoolDate;
    private Integer classId;
    private String portrait; //头像

    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;  //创建时间

    @TableField(fill = FieldFill.UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date updateTime;  //更新时间

    @TableField(exist = false)// 属性字段在表中不存在
    private ClassInfo classInfo;//当前学生的班级
    @TableField(exist = false) // 属性字段在表中不存在
    private List<Family> familyList;  //当前学生的家长
}

1.2ClassInfoMapper.java

public interface ClassInfoMapper extends BaseMapper<ClassInfo> {
    //    一对多查询
    Page<ClassInfo> findPage(Page<ClassInfo> page, @Param("className") String className);

    //所有班级id
    @Select("select id  from sys_class")
    List<Integer> getClassIds();
}

1.3原mapper.xml如下:

  <resultMap id="classInfoMap" type="ClassInfo">
   --         as别名与column一致,column与mysql表字段一致,property与java实体一致
         <id property="id" column="id"/>
         <result property="grade" column="grade"/>
         <result property="className" column="class_name"/>
         <result property="classNickname" column="class_nickname"/>
         <result property="ratedNum" column="rated_num"/>
         <result property="createTime" column="create_time"/>
         <result property="updateTime" column="update_time"/>
         <collection property="studentList" javaType="ArrayList" ofType="Student">
             <id property="id" column="s_id"/>
             <result property="name" column="s_name"/>
             <result property="sex" column="s_sex"/>
         </collection>
     </resultMap>
     <select id="findPage" resultMap="classInfoMap">
         select c.*, s.id as s_id,s.name s_name,s.sex s_sex
         from sys_class c left join sys_student s
         on c.id =s.class_id
         where c.class_name like concat('%',#{className},'%')
     </select>

1.4原查询结果:在这里插入图片描述

2.解决方案:

分两次sql查询:

 <resultMap id="classInfoMap" type="ClassInfo">
        <id property="id" column="id"/>
        <result property="grade" column="grade"/>
        <result property="className" column="class_name"/>
        <result property="classNickname" column="class_nickname"/>
        <result property="ratedNum" column="rated_num"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
        <collection property="studentList" ofType="Student"
                    select="queryStudentList" column="id">
            <id property="id" column="id"/>
            <result property="name" column="name"/>
            <result property="sex" column="sex"/>
        </collection>
    </resultMap>
    <!-- 主查询sql -->
    <select id="findPage" resultMap="classInfoMap">
--         as别名与column一致,column与mysql表字段一致,property与java实体一致
         select c.*
         from sys_class c
         where c.class_name like concat('%',#{className},'%')
    </select>
    <!-- 子查询sql -->
    <select id="queryStudentList" resultType="Student">
        select s.id,s.name,s.sex
        from sys_student s
        where s.class_id=#{id}
    </select>

附:多对多查询
表结构:sys_student,sys_family,中间表sys_student_family

    <!--    学生-家长列表展示-->
    <resultMap id="Student_familyMap" type="Student">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="sex" column="sex"/>
        <result property="portrait" column="portrait"/>
        <collection property="familyList" ofType="Family"
                    select="queryFamilyList" column="id">
            <id property="id" column="id"/>
            <result property="name" column="name"/>
            <result property="sex" column="sex"/>
            <result property="portrait" column="portrait"/>
        </collection>
    </resultMap>
    <!-- 主查询sql -->
    <select id="showStudentsAndFamily" resultMap="Student_familyMap">
         select s.id,s.name,s.sex,s.portrait
         from sys_student s
         where s.name like concat('%',#{name},'%')
    </select>
    <!-- 子查询sql -->
    <select id="queryFamilyList" resultType="Family">
        select f.id,f.name,f.sex,f.portrait
        from sys_family f join sys_student_family sf
        where f.id = sf.family_id
		and #{id} = sf.student_id
    </select>

查询结果:
在这里插入图片描述

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MyBatis-Plus支持嵌套查询,可以通过嵌套查询来处理复杂的数据库查询逻辑。在使用MyBatis-Plus进行嵌套查询时,你需要使用实体类的关联属性来定义嵌套查询的条件。 下面是一个示例,演示如何使用MyBatis-Plus进行嵌套查询: 假设有两个实体类:User和Order,User实体类中包含了一个List类型的属性orders,表示一个用户可以有多个订单。 ```java public class User { private Integer id; private String name; private List<Order> orders; // 省略getter和setter方法 } public class Order { private Integer id; private String orderNo; private Integer userId; // 省略getter和setter方法 } ``` 在进行嵌套查询时,你可以使用MyBatis-Plus提供的Wrapper类来定义查询条件。例如,如果你想查询用户名为"John"的用户及其对应的订单,可以按以下方式编写代码: ```java QueryWrapper<User> userWrapper = new QueryWrapper<>(); userWrapper.eq("name", "John"); List<User> userList = userMapper.selectList(userWrapper); for (User user : userList) { QueryWrapper<Order> orderWrapper = new QueryWrapper<>(); orderWrapper.eq("user_id", user.getId()); List<Order> orderList = orderMapper.selectList(orderWrapper); user.setOrders(orderList); } ``` 在上述代码中,首先使用userWrapper定义了查询条件,然后通过userMapper.selectList方法查询满足条件的用户列表。接着,使用orderWrapper定义了嵌套查询的条件(即根据用户ID查询订单),并通过orderMapper.selectList方法查询满足条件的订单列表。最后,将订单列表设置到用户对象的orders属性中。 这样,你就可以通过嵌套查询来获取满足特定条件的用户及其对应的订单了。当然,具体使用方式还可以根据你的需求做一些调整和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值