mybatis返回集合对象包含List<String>-----亲测可用,欢迎尝试

需求:

笔者最近遇到一个需求:

  • 一个团队对应多个人,一个人只能有一个团队
  • 根据团队的成绩的降序,查询出每个团队的信息,和其中每一个团队中每个人的名字。

分析:

  • 首先:需要查询出每个人团队的信息
  • 其次:查询出每个团队中对应的用户的名字
  • 所以返回结果应该是
    • 返回一个List,List中每一个对象都是一个团队,然后每一个团队的人员名单显示到List<String> userNames中。

数据库表:(数据库表只显示了部分必要字段)

  • 团队表
CREATE TABLE `team` (
  `id` varchar(255) NOT NULL COMMENT '雪花算法,id',
  `team_id` varchar(255) DEFAULT NULL COMMENT '团队id',
  `team_name` varchar(255) DEFAULT NULL COMMENT '团队名字',
  `group_results` float(8,2) DEFAULT NULL COMMENT '团队成绩'
  PRIMARY KEY (`id`) USING BTREE
) COMMENT='团队表';
  • 人员表
CREATE TABLE `person` (
  `id` varchar(255) NOT NULL DEFAULT '' COMMENT '主键id(用户id)',
  `team_id` varchar(22) DEFAULT NULL COMMENT '团队id',
  `user_code` varchar(22) DEFAULT NULL COMMENT '学号',
  `user_name` varchar(22) DEFAULT NULL COMMENT '用户姓名',
  PRIMARY KEY (`id`) USING BTREE
) COMMENT='人员表';

解决方案:

  • sql
SELECT
	t.team_id,
	t.team_name,
	t.group_results,
	p.`user_name` 
FROM
	`person` p
	RIGHT JOIN ( SELECT t.team_id, t.team_name, t.group_results FROM `team` t ) t ON p.team_id = t.team_id 
ORDER BY
	group_results DESC
  • 实体
    • 构造的实体,很简单,但是重要的一点就是返回的用户名的集合
@Data
public class TeamRanking {
    private String teamName;//小组名字
    private Double teamGrade;//小组成绩
    private List<String> userNames;
    private Integer teamId;
}
  • dao层
    • dao层返回的是上面那个对象的集合
List<TeamRanking> selectTeamRanking();
  • mybatis的mapper
    • 在Mapper中,使用了ResultMap的collection标签,并且:
    • collection的properties=对应名字的集合
    • collection标签中result标签的propertis内容也是对应集合的名字。
    <select id="selectTeamRanking" resultMap="selectTeamRankingMap">
        SELECT
            t.team_id,
            t.team_name,
            t.group_results,
            p.`user_name`
        FROM
            `person` p
            RIGHT JOIN ( SELECT t.team_id, t.team_name, t.group_results FROM `team` t  ) t ON p.team_id = t.team_id
        ORDER BY
            group_results DESC
    </select>


    <resultMap id="selectTeamRankingMap" type="com.tfjybj.typing.model.TeamRankingModel">
        <result property="teamId" column="team_id"></result>
        <result property="teamName" column="team_name"></result>
        <result property="teamGrade" column="group_results"></result>
        <collection property="userNames" ofType="string">
            <result property="userNames" column="user_name"></result>
        </collection>
    </resultMap>

踩过的坑:
笔者也使用过,但是最后都没有成功,最后在大家的讨论中,尝试出来上面的方式。

如果有大佬研究过mybaits的映射源码的,笔者非常迫切的请求赐教。

    <resultMap id="selectTeamRankingMap" type="com.tfjybj.typing.model.TeamRankingModel">
        <result property="teamId" column="team_id"></result>
        <result property="teamName" column="team_name"></result>
        <result property="teamGrade" column="group_results"></result>
        <collection property="userNames" ofType="string"  column="user_name"></collection>
    </resultMap>
    <resultMap id="selectTeamRankingMap" type="com.tfjybj.typing.model.TeamRankingModel">
        <result property="teamId" column="team_id"></result>
        <result property="teamName" column="team_name"></result>
        <result property="teamGrade" column="group_results"></result>
        <collection ofType="string" column="user_name">
            <result property="userNames"></result>
        </collection>
    </resultMap>
  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 25
    评论
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值