当前位置: 首页 > news >正文

MyBatis实现多层级collection嵌套查询

文章目录

      • 数据结构
      • 实体类
      • 第一层查询实现逻辑
      • 第二层查询实现逻辑
      • 第三层查询实现逻辑
      • 总结
      • 碰到问题

数据结构

在这里插入图片描述

实体类

@Data
public class AchievementRepetitionVo {
    @ApiModelProperty(value = "成果编号")
    private String code;
    @ApiModelProperty(value = "成果名称")
    private String name;
    @ApiModelProperty(value = "成果介绍")
    private String introduce;
    @ApiModelProperty(value = "查重范围文档数")
    private Integer checkNum;
    @ApiModelProperty(value = "最高相似度")
    private BigDecimal maxRate;
    @ApiModelProperty(value = "成果对比明细")
    private List<RepetitionDetailVo> detailList;
}

@Data
public class RepetitionDetailVo {
    @ApiModelProperty(value = "对比成果名称")
    private String contractName;
    @ApiModelProperty(value = "对比成果介绍")
    private String contractIntroduce;
    @ApiModelProperty(value = "对比明细")
    private List<RepetitionContractVo> contractList;
}

@Data
public class RepetitionContractVo {
    @ApiModelProperty(value = "检测成果句子")
    private String s1;
    @ApiModelProperty(value = "对比成果库句子")
    private String s2;
    @ApiModelProperty(value = "相似度")
    private BigDecimal rate;
}

第一层查询实现逻辑

1、外层service将code字段传入queryRepetitionReport方法,该方法查询的code作为参数(column=“{code=code}”)传给queryDetailList
2、mybatis循环调用queryDetailList

相关代码如下:

AchievementRepetitionVo queryRepetitionReport(String code);
<resultMap id="QueryRepetitionReportMap" type="AchievementRepetitionVo">
	<result column="code" jdbcType="VARCHAR" property="code" />
	<result column="name" jdbcType="VARCHAR" property="name" />
	<result column="introduce" jdbcType="VARCHAR" property="introduce" />
	<result column="check_num" jdbcType="INTEGER" property="checkNum" />
	<result column="rate" jdbcType="DECIMAL" property="maxRate" />
	<collection property="detailList" ofType="RepetitionDetailVo"
				select="queryDetailList"
				column="{code=code}">
	</collection>
</resultMap>

<select id="queryRepetitionReport" parameterType="string" resultMap="QueryRepetitionReportMap">
	select rate.code,application.name,rate.check_num,rate.rate,rate.introduce
	from t_achievement_repetition_rate rate
	left join t_achievement_application application on rate.code = application.code
	where rate.code = #{code}
</select>

第二层查询实现逻辑

queryDetailList接收上一层查询返回的code字段,每一次执行queryDetailList方法都会把查询出的code、contrast_code字段传给queryContractList方法
mybatis再循环调用queryContractList方法。

相关代码如下:

List<RepetitionDetailVo> queryDetailList(String code);
<resultMap id="QueryRepetitionDetailMap" type="com.aspirecn.rewardinnovation.entity.vo.achievementrepetition.RepetitionDetailVo">
	<result column="contractName" jdbcType="VARCHAR" property="contractName" />
	<result column="contractIntroduce" jdbcType="VARCHAR" property="contractIntroduce" />
	<collection property="contractList" ofType="com.aspirecn.rewardinnovation.entity.vo.achievementrepetition.RepetitionContractVo"
				select="queryContractList"
				column="{code=code,contrastCode=contrast_code}">
	</collection>
</resultMap>

<select id="queryDetailList"  resultMap="QueryRepetitionDetailMap">
	select result.code,application.name as contractName,result.contrast_code,result.contrast_introduce as contractIntroduce
	from t_achievement_repetition_result result
	left join t_achievement_application application on application.code = result.contrast_code
	where result.code = #{code}
	union
	select result.contrast_code as code,application.name as contractName,result.code as contrast_code,result.introduce as contractIntroduce
	from t_achievement_repetition_result result
	left join t_achievement_application application on application.code = result.code
	where result.contrast_code = #{code}
</select>

第三层查询实现逻辑

queryContractList接收上一层查询返回的code、contrastCode字段,
mybatis再循环调用queryContractList方法
相关代码如下:

List<RepetitionContractVo> queryContractList(String code, String contrastCode);
<select id="queryContractList" resultType="RepetitionContractVo">
	select result.s1,result.s2,result.rate
	from t_achievement_repetition_result result
	where result.code = #{code} and result.contrast_code = #{contrastCode}
	union all
	select result.s1,result.s2,result.rate
	from t_achievement_repetition_result result
	where result.contrast_code = #{code} and result.code = #{contrastCode}
</select>

总结

其实就是Collection放到resultMap,下一层把上一层的查询结果作为条件传入。
参考链接

碰到问题

第二层或者第三层的映射文件加上parameterType="string"报"nested exception is org.apache.ibatis.reflection.ReflectionException: There is no setter for property named ‘code’ in 'class java.lang.String"错误

<select id="queryDetailList"  parameterType="string" resultMap="QueryRepetitionDetailMap">
<select id="queryContractList"  parameterType="string" resultType="RepetitionContractVo">

原因不明,懂的大佬麻烦告知,不胜感激!

相关文章:

  • Containerd【轻量级容器管理工具】
  • 计算机毕业设计ssm+vue基本微信小程序的图书馆座位管理系统
  • 腾讯核心高级架构师汇总Java全栈知识点笔记,“吃透”后成功上岸!
  • 169.多数元素
  • webpack拓展篇(六十七):webpack5 新特性解析
  • CF515E Drazil and Park【思维+线段树】
  • CodeForces 1717E【线性筛】
  • Java程序猿搬砖笔记(九)
  • ROS1云课→16机器人模型从urdf到xacro
  • 花好月圆│以代码寄相思,绘嫦娥之奔月
  • WiFi基础学习到实战(一)
  • Java 在Word文档中添加艺术字
  • 打印机打印数量和碳粉监视器 2.2--PrintLimit Print Tracking
  • 懒惰型性格分析,如何改变懒惰型性格?
  • 为什么工作不能让人满意?
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • javascript面向对象之创建对象
  • Java应用性能调优
  • Js基础知识(一) - 变量
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • mongodb--安装和初步使用教程
  • Python爬虫--- 1.3 BS4库的解析器
  • spring boot 整合mybatis 无法输出sql的问题
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 服务器之间,相同帐号,实现免密钥登录
  • 复杂数据处理
  • 基于 Babel 的 npm 包最小化设置
  • 一、python与pycharm的安装
  • Java性能优化之JVM GC(垃圾回收机制)
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #pragma预处理命令
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (4)logging(日志模块)
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • *1 计算机基础和操作系统基础及几大协议
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .net core webapi 大文件上传到wwwroot文件夹
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NET关于 跳过SSL中遇到的问题
  • .NET开源项目介绍及资源推荐:数据持久层
  • .NET命令行(CLI)常用命令
  • :O)修改linux硬件时间
  • @RequestBody与@ResponseBody的使用
  • [20171106]配置客户端连接注意.txt
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大