Mybatisplus 一对多分页失效解决办法

解决思路:把联表查询的多 变为子查询

错误代码

 <resultMap id="IndicatorTemplateResult" type="com.crcc.financial.vo.IndicatorTemplateVO">
        <id column="id" property="id" />
        <result column="template_code" property="templateCode" />
        <result column="template_name" property="templateName" />
        <result column="calculation_formula_type" property="calculationFormulaType" />
        <result column="indicator_content" property="indicatorContent" />
        <result column="create_time" property="createTime" />
        <result column="create_name" property="createName" />
        <result column="actual_value_type" property="actualValueType" />
        <result column="planned_value_type" property="plannedValueType" />
        <result column="index_calculation_formula" property="indexCalculationFormula" />
        <!-- 一对多的关系 -->
        <!-- property: 指的是集合属性的值,对应类中的属性名 ofType:指的是集合中元素的类型 -->
        <collection property="calculationFormulaList" ofType="com.crcc.financial.vo.CalculationFormulaView">
            <id column="cid" property="cid" />
            <result column="subject_calculation_type" property="subjectCalculationType" />
            <result column="calculation_formula" property="calculationFormula" />
            <result column="subject_id" property="subjectId" />
            <result column="input_number" property="inputNumber" />
            <result column="subject_name" property="subjectName" />
        </collection>
    </resultMap>

    <select id="listIndicatorTemplatePage" resultMap="IndicatorTemplateResult">
        SELECT
        t.id as id,
        t.template_code,
        t.template_name,
        t.calculation_formula_type,
        t.indicator_content,
        t.create_name,
        t.create_time,
        t.actual_value_type,
        t.planned_value_type,
        t.index_calculation_formula,
        c.id as cid,
        c.subject_calculation_type,
        c.calculation_formula,
        c.subject_id,
        c.input_number,
        c.subject_name
        FROM
        f_indicator_template t
        LEFT JOIN f_calculation_formula_view c ON t.id = c.parent_id
        WHERE
        t.data_status = 1
        and
        c.type=#{type}
        <if test="templateCode !=null and templateCode != ''">
            AND t.template_code LIKE concat('%',#{templateCode} ,'%')
        </if>
        <if test="templateName !=null and templateName != ''">
            AND t.template_name LIKE concat('%',#{templateName} ,'%')
        </if>
        <if test="indicatorContent !=null and indicatorContent != ''">
            AND t.indicator_content LIKE concat('%',#{indicatorContent} ,'%')
        </if>

        group by t.id
    </select>

这个会导致分页条数不对,

正确代码:

 <!--type表示dto层的返回类型,property是返回类型里面的参数,column是sql的字段-->
    <resultMap type="com.crcc.financial.vo.IndicatorTemplateVO" id="ProjectDataResult">
        <result property="id" column="id"/>
        <result column="template_code" property="templateCode" />
        <!--ofType对应的是下面resultMap的type, column里是要传递的父类值 select是查询的sql-->
        <collection property="calculationFormulaList"  ofType="com.crcc.financial.vo.CalculationFormulaView" column="{parent_id=parent_id}"
                    select="selectFiles"/>
    </resultMap>

    <resultMap type="com.crcc.financial.vo.CalculationFormulaView" id="ProjectFileResult">
        <result column="subject_calculation_type" property="subjectCalculationType" />
        <result column="calculation_formula" property="calculationFormula" />
        <result column="subject_id" property="subjectId" />
        <result column="input_number" property="inputNumber" />
        <result column="subject_name" property="subjectName" />
    </resultMap>

    <select id="selectFiles" resultMap="ProjectFileResult">
        SELECT
        c.id AS cid,
        c.subject_calculation_type,
        c.calculation_formula,
        c.subject_id,
        c.input_number,
        c.subject_name
        FROM
        f_calculation_formula_view c
        where
        c.parent_id=#{parent_id}
        and   c.type=2
    </select>

    <select id="listIndicatorTemplatePage" resultMap="ProjectDataResult">
        SELECT
        t.id as id,
        t.id as parent_id,
        t.template_code,
        t.template_name,
        t.calculation_formula_type,
        t.indicator_content,
        t.create_name,
        t.create_time,
        t.actual_value_type,
        t.planned_value_type,
        t.index_calculation_formula
        FROM
        f_indicator_template t
        WHERE
        t.data_status = 1
        <if test="templateCode !=null and templateCode != ''">
            AND t.template_code LIKE concat('%',#{templateCode} ,'%')
        </if>
        <if test="templateName !=null and templateName != ''">
            AND t.template_name LIKE concat('%',#{templateName} ,'%')
        </if>
        <if test="indicatorContent !=null and indicatorContent != ''">
            AND t.indicator_content LIKE concat('%',#{indicatorContent} ,'%')
        </if>
    </select>

修改为子查询 并且一和多创建独立resultMap 避免指向冲突

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis-Plus 中实现一对多关系的分页查询可以使用关联查询和子查询。以下是一种常用的方法: 1. 首先,在你的实体类中定义好一对多的关联关系。假设有两个实体类:Order(订单)和OrderItem(订单项),一个订单可以包含多个订单项。 ```java public class Order { private Long id; private String orderNo; private List<OrderItem> orderItems; // getter 和 setter 方法省略 } public class OrderItem { private Long id; private Long orderId; private String itemName; // getter 和 setter 方法省略 } ``` 2. 在使用 MyBatis-Plus 进行分页查询时,可以使用关联查询或子查询来获取一对多关系的数据。 - 关联查询方式: ```java IPage<Order> page = new Page<>(current, size); QueryWrapper<Order> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("user_id", userId); // 根据用户ID查询订单 IPage<Order> orderPage = orderMapper.selectPage(page, queryWrapper); // 遍历订单列表 List<Order> orderList = orderPage.getRecords(); for (Order order : orderList) { QueryWrapper<OrderItem> itemQueryWrapper = new QueryWrapper<>(); itemQueryWrapper.eq("order_id", order.getId()); // 根据订单ID查询订单项 List<OrderItem> orderItems = orderItemMapper.selectList(itemQueryWrapper); order.setOrderItems(orderItems); // 将订单项列表设置到订单中 } ``` - 子查询方式: ```java IPage<Order> page = new Page<>(current, size); IPage<Order> orderPage = orderMapper.selectPage(page, new QueryWrapper<Order>() .eq("user_id", userId) .inSql("id", "SELECT order_id FROM order_item")); // 使用子查询获取订单项 // 遍历订单列表 List<Order> orderList = orderPage.getRecords(); for (Order order : orderList) { QueryWrapper<OrderItem> itemQueryWrapper = new QueryWrapper<>(); itemQueryWrapper.eq("order_id", order.getId()); // 根据订单ID查询订单项 List<OrderItem> orderItems = orderItemMapper.selectList(itemQueryWrapper); order.setOrderItems(orderItems); // 将订单项列表设置到订单中 } ``` 以上代码示例假定你已经定义了相应的 Mapper 接口和映射文件,并且已经配置好了 MyBatis-Plus 的相关配置。 这样,你就可以实现一对多关系的分页查询了。希望对你有帮助!如果有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值