Mybatis<collection>实现一对多

时隔多年又用到这样的查询方式了,提前声明一下分页最后返回的数据会小于每页条数,废话不多说直接上代码!

@Data
public class PbcUserTargetTaskPageVO {

    @ApiModelProperty("个人绩效指标id")
    private Long id;

    @ApiModelProperty("月份")
    private String month;

    @ApiModelProperty("工号")
    private String employeeNo;

    @ApiModelProperty("姓名")
    private String employeeName;

    @ApiModelProperty("月份")
    private String oraName;

    @ApiModelProperty(value = "目标")
    private BigDecimal goal;

    @ApiModelProperty(value = "绩效指标")
    private String targetName;

    @ApiModelProperty(value = "个人绩效指标关键任务")
    private List<PbcKeyTaskVO> taskList;
}
@Data
public class PbcKeyTaskVO {

    @ApiModelProperty(value = "主键id")
    private Long id;

    @ApiModelProperty(value = "任务编码")
    private String code;

    @ApiModelProperty(value = "任务名称")
    private String name;

    @ApiModelProperty(value = "任务类型")
    private String type;

    @ApiModelProperty(value = "任务描述")
    private String detail;

    @ApiModelProperty(value = "创建人工号")
    private String createBy;

    @ApiModelProperty(value = "创建人名字")
    private String createName;

    @ApiModelProperty(value = "创建时间")
    private String createTime;

    @ApiModelProperty(value = "是否关联绩效指标任务 Y=已关联,N=未关联")
    private String isRelated;
}
public interface PbcUserTargetTaskMapper extends BaseMapper<PbcUserTargetTask> {

    Page<PbcUserTargetTaskPageVO> pageList(Page page, PbcUserTargetTaskPageRequest dto);
}
    <!-- 通用查询映射结果 -->
    <resultMap id="PageResultMap" type="com.shinho.plrs.manager.pojo.vo.PbcUserTargetTaskPageVO">
        <id column="user_target_id" property="id" />
        <result column="month" property="month" />
        <result column="employee_no" property="employeeNo" />
        <result column="employee_name" property="employeeName" />
        <result column="oraName" property="oraName" />
        <result column="goal" property="goal" />
        <result column="targetName" property="targetName" />
        <!-- 配置一对多关联 -->
        <collection property="taskList" ofType="com.shinho.plrs.manager.pojo.vo.PbcKeyTaskVO">
            <id property="id" column="task_id"/>
            <result property="code" column="task_code"/>
            <result property="name" column="task_name"/>
            <result property="type" column="task_type"/>
            <result property="detail" column="task_detail"/>
            <result property="createTime" column="task_create_time"/>
       </collection>
    </resultMap>

<select id="pageList" resultMap="PageResultMap">
        SELECT
            a.id AS user_target_id,
            a.`user_number` AS employee_no,
            a.`name` AS employee_name,
            a.`position` AS position,
            d.ora_name AS oraName,
            a.`target_code`,
            e.`name` AS targetName,
            a.`goal`,
            a.`version_date` AS `month`,
            b.task_id,
            c.`code` AS task_code,
            c.`name` AS task_name,
            c.type AS task_type,
            c.detail AS task_detail,
            c.create_time AS task_create_time
        FROM
            user_target_result a
            LEFT JOIN pbc_user_target_task b ON a.version_date=b.`month` AND a.user_number=b.employee_no AND a.target_code=b.target_code
            LEFT JOIN pbc_key_task c ON b.task_id=c.id
            LEFT JOIN assess_base_snapshot d ON a.version_date=d.`month` AND a.user_number=d.employee_no AND a.position=d.assess_position_name
            LEFT JOIN plrs_target e ON a.target_code=e.`code`
        WHERE
            a.version_date = '2024-07'
        AND a.user_number = '21120060'
        AND ( d.ora_id = '01003403' OR locate('01003403',d.ora_parent_group ) > 0)
        ORDER BY a.user_number DESC
    </select>

这里就知道了,一页10条,但是返回后有一条数据1v2,所以变成了9,前端页面会看起来很怪就会有问题,这是只有一个,如果一对10那一页就只返回了一条数据。这种查询不适合用于分页查询!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis中的<resultMap>标签用于将查询结果集中的列与Java对象属性之间进行映射。使用<resultMap>标签可以灵活地对查询结果进行映射,可以将一个查询结果映射到多个Java对象中,也可以将多个查询结果映射到一个Java对象中。 <resultMap>标签的基本语法如下: ```xml <resultMap id="resultMap" type="javaType"> <!-- Result property --> <result property="propertyName" column="columnName" /> <!-- Other Result property element --> </resultMap> ``` 其中,id属性为<resultMap>标签的唯一标识符,type属性指定映射的Java类型。 <result>标签用于指定一个Java对象属性和查询结果集中的一列之间的映射关系。其中,property属性指定Java对象属性的名称,column属性指定查询结果集中的列名。 <resultMap>标签还支持一些高级属性,例如:继承其他<resultMap>标签、自动映射、高级映射等。 继承其他<resultMap>标签可以使得<resultMap>之间形成继承关系,从而减少重复的映射定义。 自动映射可以根据Java对象属性的名称和查询结果集中的列名之间的相似度自动生成映射关系。 高级映射可以将查询结果集中的一列映射到Java对象的一个属性中,并且该属性的值是由多个列合并而成的,可以使用<association>和<collection>标签实现。 总的来说,<resultMap>标签是Mybatis中非常重要的一个标签,掌握其基本语法和高级用法对于开发高效的Mybatis应用非常有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值