问题描述:
使用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);