Mybatis-plus 多表关联复杂查询

17,118 阅读3分钟

既然出了这个问题,那么一定是Mybatis-plus用了一段时间了,那么这里我就不多赘述了,直接上代码和我所遇到的问题。这里mybatis-plus的多表关联复杂查询,在网上找了好久也没找到真正适用的,所以这里我整理了遇到的问题和如何解决的,如果你着急看解决方法,直接跳转到下面的Mybatis-plus分页实现一栏。

mybatis思想去实现分页查询(错误)

// service
   Page<SysUser> SysUserPage(Page<SysUser> page, SysUser info);

// serviceImpl
@Override
    public Page<SysUser> SysUserPage(Page<SysUser> page, SysUser info) {
        return page.setRecords(baseMapper.SysUserPage(page, info));
    }
    
// mapper
    List<SysUser> SysUserPage(Page page, SysUser info);
    
mapper.xml
    <select id="SysUserPage" resultMap="BaseResultMap">
        select <include refid="Column_List"/> from sys_user u
        left join sys_company c on c.company_id = u.company_id
        where u.company_id = #{company_id}
    </select>

这里会死报绑定异常,以为和Hibernate一样实现不了只需要自己写sql就可以,后来网上找了好久发现mybatis-plus里面所有的查询与修改必须使用QueryWrapper和UpdateWrapper。确实要把mybatis的思想转换一下了。

mybatis-plus 使用QueryWrapper做分页查询 (错误)

// controller
    sysService.SysUserPage(new Page(1,10), new QueryWrapper<SysUser>().eq("company_id",52L));

// service
   Page<SysUser> SysUserPage(Page<SysUser> page, QueryWrapper<SysUser> wrapper);

// serviceImpl
@Override
    public Page<SysUser> SysUserPage(Page<SysUser> page, QueryWrapper<SysUser> wrapper) {
        return page.setRecords(baseMapper.SysUserPage(page, wrapper));
    }
    
// mapper
    List<SysUser> SysUserPage(Page page, QueryWrapper<SysUser> wrapper);
    
mapper.xml
    <select id="SysUserPage" resultMap="BaseResultMap">
        select <include refid="Column_List"/> from sys_user u
        left join sys_company c on c.company_id = u.company_id
    </select>

这里虽说没报错,但是问题同样严重,QueryWrapper里的筛选条件没带入,所以怎么查询都是把所有的数据都给查询出来,再想找解决办法网上都是简单的查询,所以只能去看官网,终于在官网最新更新的文档里面找到了正确的语法。

Mybatis-plus分页实现 (解决)

官网实现: mp.baomidou.com/guide/page.…

// controller
    QueryWrapper wrapper = Wrappers.<SysUser>query().eq("u.company_id",52L);
    Page<SysUser> page = sysUserService.SysUserPage(new Page<>(1,10), wrapper);
    logger.info(JSONObject.toJSONString(page));

// service
   Page<SysUser> SysUserPage(Page<SysUser> page, QueryWrapper<SysUser> wrapper);

// serviceImpl
@Override
    public Page<SysUser> SysUserPage(Page<SysUser> page, QueryWrapper<SysUser> wrapper) {
        return page.setRecords(baseMapper.SysUserPage(page, wrapper));
    }
    
// mapper
    List<SysUser> SysUserPage(Page page, @Param(Constants.WRAPPER) QueryWrapper<SysUser> wrapper);
    
mapper.xml
    <select id="SysUserPage" resultMap="BaseResultMap">
        select <include refid="Column_List"/> from sys_user u
        left join sys_company c on c.company_id = u.company_id
        ${ew.customSqlSegment}
    </select>

官网是这么说的: 在使用了mybatis-plus之后, 自定义SQL的同时也想使用Wrapper的便利应该怎么办? 在mybatis-plus版本3.0.7得到了完美解决 版本需要大于或等于3.0.7, 以下两种方案取其一即可。他说的两种方案无非是在mapper里使用@Select和xml文件里写出多表的关系,至于参数由QueryWrapper传递。这里我专门挑了两张表同名字段,只需要加上对应表的命名就可以,至于value与实体类的数据类型对应上即可。关键在于Wrappers.query().eq("u.company_id",52L)该wrappers的生成语法注意下即可。

小结

还是先看看官方文档靠谱点儿。 有什么错误的地方欢迎指正。