概要:需要通过两个字段来确定 一条数据,根据查询到的数据进行名字和code 的模糊查询

思考:<foreach>标签可以单条件的查询,不能够满足需求,需要进行sql 的拼接,使用LambdaQueryWrapper进行sql拼接,用到or(),and()方法,但是由于查询是有先后循序的,list查询和模糊查询在用一层,如果只是单纯的使用or ()拼接的话,like模糊查询会失效,需要把list的集合进行list 的包装

解决:

//获取list对象
        List<RateOnlineUseDTO> onlineChannelList = baseMapper.getUseDetail(reserveRule.getRuleCode());
//定义LambdaQueryWrapper
        LambdaQueryWrapper<PrPriceplanHotel> queryWrapper = new LambdaQueryWrapper<>();

        List<ReserveRuleUseDetailVO> reserveRuleUseDetailVOList = new ArrayList<>();
//拼接查询每一个list的对象
        queryWrapper.and((wrapper) -> {
            onlineChannelList.stream().forEach(rateOnlineChannel -> {
                wrapper.or().eq(PrPriceplanHotel::getTemplateCode, rateOnlineChannel.getRateCode())
                        .eq(PrPriceplanHotel::getHotelCode, rateOnlineChannel.getHotelCode());
            });

        });
//拼接模糊查询

        if (StringUtils.isNotEmpty(req.getKeyword())) {
            queryWrapper.and(wq -> wq
                    .like(PrPriceplanHotel::getTemplateCode, req.getKeyword())
                    .or()
                    .like(PrPriceplanHotel::getTemplateName, req.getKeyword()));


        }
//返回数据
        List<PrPriceplanHotel> priceplanHotelList = iPrPriceplanHotelService.list(queryWrapper);

打印出来的sql

SELECT
	id,
	CODE,
    NAME 
FROM
	pr_otel 
WHERE
	((
			templat = ? 
			AND hotel = ? 
			OR template = ? 
			AND hotel = ? 
			OR template = ? 
			AND hotel = ? 
			) 
		AND (
		template_co LIKE ? 
	OR template_na LIKE ?))

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐