Jeecg-多表联合查询

需求

Jeecg提供的生成工具满足了最普遍的代码功能,也将代码最简化,但在业务处理中常出现多表联合查询的需求,比如两表条件联合查询,而mybatis-plus框架使用的QueryWrapper显然无法满足,考虑使用其他方式实现。

思路

方式一
controller层与分页参数形式一样进行他表参数添加,使用map形式传参,不影响默认的底层业务;
方式二
对Entity添加字段属性,问题是在生成查询语句时,会自动映射Entity字段为数据库属性导致出错,需要重写原先的查询方法,此时添加注解@TableField(exist = false)即可;

实现

方式一
controller层改装

	@AutoLog(value = "建筑信息-分页列表查询")
    @ApiOperation(value = "建筑信息-分页列表查询", notes = "建筑信息-分页列表查询")
    @GetMapping(value = "/list")
    public Result<?> queryPageList1(
            ProBuildInfo proBuildInfo,
            @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
            @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
            @RequestParam(name = "unitId", defaultValue = "") String unitId,
            HttpServletRequest req) {
        Page<ProBuildInfo> page = new Page<ProBuildInfo>(pageNo, pageSize);
        if (StringUtils.isEmpty(unitId)) {
            QueryWrapper<ProBuildInfo> queryWrapper = QueryGenerator.initQueryWrapper(proBuildInfo, req.getParameterMap());
			IPage<ProBuildInfo> pageList = proBuildInfoService.page(page, queryWrapper);
            return Result.ok(pageList);
        } else {
            Map map = com.alibaba.fastjson.JSONObject.parseObject(com.alibaba.fastjson.JSONObject.toJSONString(proBuildInfo), Map.class);
            map.put("unitId", unitId);
            IPage<ProBuildInfo> pageList = proBuildInfoService.pageByUnitAndType(page, map);
            return Result.ok(pageList);
        }
    }

mapper添加方法

public interface ProBuildInfoMapper extends BaseMapper<ProBuildInfo> {
    IPage<ProBuildInfo> pageByUnitAndType(IPage<ProBuildInfo> page, Map map);
}

xml文件方法映射

	<select id="pageByUnitAndType" parameterType="hashmap" resultType="org.jeecg.modules.xiaoan.entity.ProBuildInfo">
        SELECT pro_build_info.*,pro_build_r_unit.unit_id,pro_build_r_unit.build_r_unit_type
        FROM  pro_build_r_unit
        inner join pro_build_info
        on pro_build_r_unit.unit_id = #{unitId} and pro_build_info.id=pro_build_r_unit.build_id
        <if test="buildRUnitType!=null and buildRUnitType!=''">
            and pro_build_r_unit.build_r_unit_type = #{buildRUnitType}
        </if>
        WHERE 1=1
        <include refid="assembling"/>
    </select>

	<!--检索条件拼装-->
    <sql id="assembling">
        <if test="id!=null and id!=''">
            and pro_build_info.id = #{id}
        </if>
        <if test="code!=null and code!=''">
            and pro_build_info.code = #{code}
        </if>
        <if test="name!=null and name!=''">
            and pro_build_info.name like CONCAT('%',#{name},'%')
        </if>
    </sql>

方式二
controller层改装

	@AutoLog(value = "建筑信息-分页列表查询")
    @ApiOperation(value = "建筑信息-分页列表查询", notes = "建筑信息-分页列表查询")
    @GetMapping(value = "/list")
    public Result<?> queryPageList(ProBuildInfo proBuildInfo,
                                   @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                   HttpServletRequest req) {
        Page<ProBuildInfo> page = new Page<ProBuildInfo>(pageNo, pageSize);
        if (StringUtils.isEmpty(proBuildInfo.getUnitId())) {
            IPage<ProBuildInfo> pageList = proBuildInfoService.selectPage(page, proBuildInfo);
            return Result.ok(pageList);
        } else {
            IPage<ProBuildInfo> pageList = proBuildInfoService.pageByUnitAndType(page, proBuildInfo);
            return Result.ok(pageList);
        }
    }

mapper添加方法

public interface ProBuildInfoMapper extends BaseMapper<ProBuildInfo> {
    IPage<ProBuildInfo> selectPage(IPage<ProBuildInfo> page, @Param("proBuildInfo") ProBuildInfo proBuildInfo);
    IPage<ProBuildInfo> pageByUnitAndType(IPage<ProBuildInfo> page, @Param("proBuildInfo") ProBuildInfo proBuildInfo);
}

xml文件方法映射

	<select id="selectPage" parameterType="java.lang.String" resultType="org.jeecg.modules.xiaoan.entity.ProBuildInfo">
        SELECT pro_build_info.*
        FROM  pro_build_info
        WHERE 1=1
        <include refid="assembling"/>
    </select>
	<select id="pageByUnitAndType" parameterType="java.lang.String" resultType="org.jeecg.modules.xiaoan.entity.ProBuildInfo">
        SELECT pro_build_info.*,pro_build_r_unit.unit_id,pro_build_r_unit.build_r_unit_type
        FROM  pro_build_r_unit
        inner join pro_build_info
        on pro_build_r_unit.unit_id = #{proBuildInfo.unitId} and pro_build_info.id=pro_build_r_unit.build_id
        <if test="proBuildInfo.buildRUnitType!=null and proBuildInfo.buildRUnitType!=''">
            and pro_build_r_unit.build_r_unit_type = #{proBuildInfo.buildRUnitType}
        </if>
        WHERE 1=1
        <include refid="assembling"/>
    </select>

	<!--检索条件拼装-->
    <sql id="assembling">
        <if test="proBuildInfo.id!=null and proBuildInfo.id!=''">
            and pro_build_info.id = #{proBuildInfo.id}
        </if>
        <if test="proBuildInfo.code!=null and proBuildInfo.code!=''">
            and pro_build_info.code = #{proBuildInfo.code}
        </if>
        <if test="proBuildInfo.name!=null and proBuildInfo.name!=''">
            and pro_build_info.name like CONCAT('%',#{proBuildInfo.name},'%')
        </if>
    </sql>

补充
两种方式都至少需要提供一个方法从service到mapper的映射,检索条件拼装可以使用该工具类。建议使用方式一保证代码规范,Entity只和数据库映射。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值