Mybatis+Collection一对多表查询踩坑
需求
自己写的springboot项目中有这样一个需求:
将简历模板映射到数据库中。
思考
简历模板包含多个属性,每个属性又有多个条目,比如个人上学经历,有小学,初中,高中,大学等多个条目,如果把这些全部都存到一个表里就不那么好。
解决方案
将简历表作为主表,将简历中包含的属性作为从表,这样就形成了主从表的结构。
实现方法
现在需要的是后端从数据库中将简历模板信息拿到,就涉及到了主从表查询,这里介绍MyBatis的关联查询
MyBatis关联查询
一对一association查询
很简单,就是一对多的简易版,不多赘述。主要讲collection查询。
一对多collection查询
一:建主从表的实体类
其中lev1Entity是主表其他都是从表
二:需要将从表作为一个属性单独的加到主表实体类中
三:接下来就要用到collection查询了
首先需要将collection作为返回写到resultmap中
注意resultmap的type和id等属性。
四:然后就写select查询即可
五:查询到的结果如下:
前面的主表内容相同,后面是一个从表的两个条目,查询结果是分开的,但是MyBatis根据一定规则将他们自动映射到数据集List中,合并为一条数据,这也就有了下面的坑:
坑1
坑1:注意这里select的返回类型需要是resultmap对应上面返回结果的resultmap类型,不能是resulttype,否则查询到的多条结果将不会合并到list’中,这里是一个注意点。
坑2
坑2:坑2是因为一个collection只能多一个sql查询,而我需要一个主表对应多个从表,就需要多个collection查询,select语句前面贴图已经有了,但是我遇到的问题是他们始终合并不了,类似于笛卡尔积,会多出许多重复的条目
原因:
原因是MyBatis中进行结果映射时是用数据库的列名进行查询的,这时如果多个表存在相同的字段名时,他们就会重复,不会合并,这是MyBatis这里的规则。
解决方案一:select查询时用别名查询
解决方案二:修改数据库中没有相同的字段名即可。