作者:275514908_9369d7 | 来源:互联网 | 2023-10-09 20:18
篇首语:本文由编程笔记#小编为大家整理,主要介绍了使用mybatis的resultMap进行复杂查询相关的知识,希望对你有一定的参考价值。
本来写了一份,临时有事忘保存,丢了,现在重新写一份
使用mybatis的resultMap进行复杂查询
首先来了解一下数据表的结构。
现在共有两张表,paper_template和paper_template_question_setting,其中paper_template是主表,setting是从表,主要负责记录模板中的一些设置,两表是一对多的关系
现在我想查询模板列表,并且附带模板的设置信息
select t.id,t.name,s.* from paper_template as t
left join paper_template_question_setting as s on t.id= s.template_id
where t.id=104
对应的resultmap应该这么写
<resultMap id="testResultMap" type="com.xkw.its.homework.papertemplate.PaperTemplateDto">
<id column="id" jdbcType="INTEGER" property="id"/>
<result column="name" jdbcType="VARCHAR" property="name"/>
<result column="organization_id" jdbcType="VARCHAR" property="organizationId"/>
<result column="stage_id" jdbcType="VARCHAR" property="stageId"/>
<result column="subject_id" jdbcType="INTEGER" property="subjectId"/>
<result column="grade_id" jdbcType="INTEGER" property="gradeId"/>
<result column="semester" jdbcType="TINYINT" property="semester"/>
<result column="year" jdbcType="INTEGER" property="year"/>
<result column="create_user_id" jdbcType="VARCHAR" property="createUserId"/>
<result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
<result column="update_user_id" jdbcType="VARCHAR" property="updateUserId"/>
<result column="explain_info" jdbcType="VARCHAR" property="explainInfo"/>
<result column="difficulty_degree" jdbcType="VARCHAR" property="difficultyDegree"/>
<result column="student_info" jdbcType="VARCHAR" property="studentInfo"/>
<result column="sealing_line_text" jdbcType="VARCHAR" property="sealingLineText"/>
<result column="is_deleted" jdbcType="BIT" property="isDeleted"/>
<result column="source" jdbcType="TINYINT" property="source"/>
<collection property="paperTemplateQuestionSettingDtoList"
ofType="com.xkw.its.homework.papertemplatequestionsetting.PaperTemplateQuestionSetting">
<id column="id" jdbcType="INTEGER" property="id"/>
<result column="start" jdbcType="INTEGER" property="start"/>
<result column="end" jdbcType="INTEGER" property="end"/>
<result column="question_count" jdbcType="INTEGER" property="questionCount" />
<result column="is_composite" jdbcType="BIT" property="isComposite" />
<result column="qcourse_id" jdbcType="INTEGER" property="courseId" />
<result column="qsubject_id" jdbcType="INTEGER" property="subjectId"/>
<result column="question_type_id" jdbcType="VARCHAR" property="questionTypeId"/>
<result column="score" jdbcType="DOUBLE" property="score"/>
<result column="template_id" jdbcType="INTEGER" property="templateId"/>
<result column="difficulty_id" jdbcType="INTEGER" property="difficultyId" />
collection>
resultMap>
此处做一个说明
property 对应的类中的字段名
collection 对应一个集合
ofType 是集合对应的类名
将子类的各个字段放在collection 中即可
接口的查询结果如下图所示
对比从数据库的直接查询结果,和从接口获取的结果发现:
paperTemplateQuestionSettingDtoList接口中只返回一条,并且id和template表中的id一样。这是因为本次查询中出现了两个id,查询映射自动默认第一个。解决方法就是在查询语句中为setting表中的id重命名,代码如下:
select *,q.id as q_id
from paper_template t
left join paper_template_catalog c on t.id=c.template_id
left join paper_template_question_setting q on t.id=q.template_id
where t.id=104
今天只测试了带集合的用法,带对象的用法还没有测试,改天再来补充