解决IPage+ QueryWrapper 多表联查、条件搜素、模糊匹配的分页问题
第一步 Controller层代码,注意这里引入的是mapper层代码,对里面list查询语句重写。
wapper.like(“p.name”,query.get(“produce_name”) );这行代码需要注意,其p.name中的p是关联表的简写。
@Autowired
private IntroductionMapper introductionMapper;
/**
* 分页查询
* @param pageBean
* @return
*/
@RequestMapping("/list")
public R list(@RequestBody FuPage pageBean){
Map<String, String> query = pageBean.getQuery();
Page<Introduction> page=new Page<>(pageBean.getPageNum(),pageBean.getPageSize());
QueryWrapper<Introduction> wapper = new QueryWrapper<Introduction>();
if (StrUtil.isNotBlank(query.get("details_name"))) {
wapper.like("details_name",query.get("details_name") );
}
if (StrUtil.isNotBlank(query.get("produce_name"))) {
wapper.like("p.name",query.get("produce_name") );
}
IPage<Introduction> pageResult = introductionMapper.list(page, wapper);
Map<String,Object> map=new HashMap<>();
map.put("list",pageResult.getRecords());
map.put("total",pageResult.getTotal());
return R.ok(map);
}
第二步 Mapper.java 中重写方法 @Param(Constants.WRAPPER)不能少
/**
* 列表
* @return
*/
public IPage<Introduction> list(Page<Introduction> page, @Param(Constants.WRAPPER) QueryWrapper<Introduction> wapper);
第三步 对应xml代码。其中${ew.customSqlSegment}会自动识别前面wrapper中的查询条件,自动给sql语句后面拼接。
<select id="list" parameterType="Map" resultMap="IntroductionResult">
SELECT i.id,i.produce_id,i.user_id,i.details_name,i.details,p.name,p.proPic
FROM introduction i
LEFT JOIN t_product p ON i.produce_id = p.id
${ew.customSqlSegment}
</select>
其中 StrUtil.isNotBlank()判断传入参数是否为空
方法从maven引入
<!--可用于模糊搜索时候,判断字符串是否为空-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.0</version>
</dependency>
FuPage类为自定义类
public class FuPage {
private int pageNum; // 第几页
private int pageSize; // 每页记录数
private int start; // 起始页
private Map<String,String> query; // 查询参数
// get set toString方法自己生成
}