实例:MyBatis-Plus自定义联表分页查询-动态sql实现
程序员文章站
2022-03-29 17:17:22
系列文章目录第一篇:实例:Mybatis-Plus自定义分页查询第二篇:实例:Mybatis-plus自定义连表分页查询第三篇:实例:Mybatis-plus自定义连表分页查询-动态sql实现文章目录系列文章目录一、简介二、关键代码三、总结一、简介高级检索所检索的项中,往往会存在对关联项的检索。比如说,派车单高级检索,名称、派车日期等检索项在派车表内,但以所配送的具体产品编号作为检索项时,就必须做相应联表查询。数据库模型如下:派车单关联若干发货单,关联车辆(vehicle_id),发货...
系列文章目录
第一篇:实例:MyBatis-Plus自定义分页查询
第二篇:实例:MyBatis-Plus自定义联表分页查询
第三篇:实例:MyBatis-Plus自定义联表分页查询-动态sql实现
一、简介
高级检索所检索的项中,往往会存在对关联项的检索。
比如说,派车单高级检索,名称、派车日期等检索项在派车表内,但以所配送的具体产品编号作为检索项时,就必须做相应联表查询。
数据库模型如下:
派车单关联若干发货单,关联车辆(vehicle_id),发货单关联若干发货单明细
二、关键代码
- WorksheetServiceImpl.java:
/**
* 派车单高级检索
* @param param 检索项
* @return
*/
public IPage<WorksheetDetailsBean> queryWorksheet(SlWorksheetQueryExeParam param) throws Exception {
Page<Worksheet> page1 = new Page<>(param.getPage(), param.getPagesize());
return worksheetMapper.selectPageCusNew(page1, param);
}
- WorksheetMapper.java:
/**
* 派车单高级检索
* @param page1 分页对象
* @param param 检索项
* @return
*/
IPage<WorksheetDetailsBean> selectPageCusNew(
Page<Worksheet> page1,
@Param("qryPm") SlWorksheetQueryExeParam param
);
- WorksheetMapper.xml:
出于需求,此sql查询结果映射到了另一个类。
否则,用 resultType="com.xxxxx.api.model.WorksheetDetailsBean"
代替 resultMap="worksheetWithStoreAndSkuNum"
<select id="selectPageCusNew" resultMap="worksheetWithStoreAndSkuNum">
SELECT DISTINCT w.* FROM sl.sl_worksheet w
<if test="qryPm.vehicleNo != null and qryPm.vehicleNo != ''">
INNER JOIN sl.sl_vehicle v
ON v.delete_time IS NULL AND w.vehicle_id = v.id AND v.license LIKE '%${qryPm.vehicleNo}%'
</if>
<if test="qryPm.productCode != null and qryPm.productCode != ''
or qryPm.productName != null and qryPm.productName != ''">
INNER JOIN sl.sl_delivery dly
ON dly.delete_time IS NULL AND w.name = dly.worksheet_no
INNER JOIN sl.sl_delivery_to_line d2l
ON d2l.delete_time IS NULL AND dly.id = d2l.delivery_id
INNER JOIN sl.sl_delivery_line dl
ON dl.delete_time IS NULL AND d2l.line_id = dl.id
<if test="qryPm.productCode != null and qryPm.productCode != ''">
AND dl.code LIKE '%${qryPm.productCode}%'
</if>
<if test="qryPm.productName != null and qryPm.productName != ''">
AND dl.name LIKE '%${qryPm.productName}%'
</if>
</if>
WHERE w.delete_time IS NULL AND w.oid = #{qryPm.oid}
<if test="qryPm.rosteringId != null"> AND w.rostering_id = #{qryPm.rosteringId}</if>
<if test="qryPm.state != null and qryPm.state != ''"> AND w.status = #{qryPm.state}</if>
<if test="qryPm.handlerPartnerIdList != null"> AND w.handler_partner_id IN
<foreach collection="qryPm.handlerPartnerIdList" item="handlerPid" open="(" close=")" separator=",">
#{handlerPid}
</foreach>
</if>
<if test="qryPm.startCreateTime != null and qryPm.endCreateTime != null">
AND w.create_time BETWEEN #{qryPm.startCreateTime} AND #{qryPm.endCreateTime}
</if>
<if test="qryPm.worksheetName != null and qryPm.worksheetName != ''">
AND w.name LIKE '%${qryPm.worksheetName}%'
</if>
ORDER BY w.create_time DESC, w.id DESC
</select>
三、总结
-
xml自定义sql中,通过mybatis的动态sql(标签)判断是否需要联表查询。有两处联表查询,分别检索派车单关联的车辆及配送产品。
-
上述实例联表查询的结果会产生重复问题,需使用
DISTINCT w.*
去重。
当然,如非此例的针对派车单的查询,无需去重。
MyBatis相关教程:
MyBatis教程
MyBatis-Plus官方文档
本文地址:https://blog.csdn.net/ymzhaobth/article/details/112568161