关于Mybatis-plus多表联查自定义sql分页查询

问题描述:

使用mybatis-plus进行开发过程中,单表得增删改查等都可以利用封装好的方法,而一些场景设计多表联合查询,且需要自定义字段的,就需要进行自定义sql

使用方法:

1、service中使用自定义的方法。

// IPage<Ship> pageData = shipMapper.selectPage(page, queryWrapper);
 IPage<Ship> pageData= shipMapper.mypagelist(page,queryWrapper);

上面注释的是我们使用内置的分页方法,下面mypagelist则为我们自己的自定义,因为要涉及到多表联查。

2、mapper代码示范

 IPage<Ship> mypagelist(Page<Ship> page, @Param("ew") Wrapper<Ship> queryWrapper);

这里要使用内置的Wrapper来进行参数约束,所以必须加Param("ew"),或者你自己直接将queryWrapper命名为ew也可以。

3、xml

 <result property="ShipOwner" column="ship_owner_name"/>
    </resultMap>
    <resultMap id="ship_1" type="com.pcitc.lng.ops.purchase.model.Ship" extends="shipMap">
        <association property="tankerTypeDto" javaType="com.pcitc.lng.ops.purchase.dto.TankerTypeDto">
            <result property="fullName" column="ship_type_name"/>
        </association>
    </resultMap>
    <select id="mypagelist" resultMap="ship_1">
        SELECT a.id,a.code,a.full_name,b.full_name ship_type_name,c.full_name ship_owner_name FROM lng_b_ship AS a
        LEFT JOIN lng_b_tanker_type  AS b ON a.ship_type_id=b.id
        LEFT JOIN lng_b_shipowner AS c ON a.shipowner_id=c.id
        ${ew.customSqlSegment}
    </select>

这里我需要关联查询的表字段有shipowner和tankerType,可以都按照

<result property="ShipOwner" column="ship_owner_name"/>这个模式写,或者也可以都按照
<association 这样写,看你实体类的定义和需求来自定义增加字段

注意:${ew}后面跟customSqlSegment会自己拼接where  ${ew} SqlSgment则不会自己拼接

如果多表关联查询的字段有重复,比如A表的id数据库列名是id,B表的也是id,则需要注意wrapper这里用加上你查询sql语句的别名,我这里是别名 a,所以

queryWrapper.eq("a.id", shipDto.getId());

而不能再采取

queryWrapper.lambda().eq(Ship::getId, shipDto.getId())这样的写法,否则会报错,提示你无法确定ID是那一列。

还有另外一种则是将sql语句通过注解的形式写在mapper接口方法上

 @Select("select * from 表名 " +
            "${ew.customSqlSegment}")
    IPage<OpsPurchaseInt> mypagelist(Page<OpsPurchaseInt> page, @Param("ew") Wrapper<OpsPurchaseInt> queryWrapper);

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值