Mybatis坑之collection单属性list
今天写了一个一对多的查询用到了collection,首先是这样的 这样的 select u.id as u_id, u.company_id as companyId, u.name,u.sex, u.mobile, u.email, u.id_card as id_card, u.work_code as work_code, u.position, u.if_delete as if_delete, u.update_time as update_time, ur.supplier_user_id as supplier_user_id,ur.su 在MyBatis中,`collection`元素是用来处理一对多关联关系的,比如一个用户可以有多个组织机构。在本文提到的场景中,开发者遇到了一个关于`collection`的坑,即查询结果中的`id`与`supplierOrganizationIdList`里的值相同,导致数据不正确。这个问题的解决关键在于SQL查询语句的顺序。 我们分析一下原问题的SQL查询: ```sql select u.id as u_id, u.company_id as companyId, u.name, ... ur.supplier_user_id as supplier_user_id,ur.supplier_id as supplier_id, orgr.supplier_organization_id as orgrm_supplier_organization_id from user u left join user_relation ur on u.id = ur.user_id left join user_organization_relation uor on u.id = uor.user_id left join organization_relation orgr on uor.organization_id = orgr.organization_id where orgr.supplier_id = #{supplierId} and u.company_id = #{companyId} and orgr.company_id=#{companyId} and uor.company_id = #{companyId} and u.name like '%#{name}%' and u.update_time > #{time} ``` 在这个查询中,用户`user`通过`user_relation`表与供应商用户`supplier_user_id`和供应商`supplier_id`关联,同时通过`user_organization_relation`表与组织关系`organization_relation`关联,获取供应商组织ID`supplier_organization_id`。 问题出在查询结果中,`id`与`supplierOrganizationIdList`的值相同,这可能是因为在MyBatis的映射配置中,集合属性(如`supplierOrganizationIdList`)的取值依据是子查询的结果,而在原SQL中,`supplier_organization_id`的选取顺序位于`u.id`之后,导致MyBatis错误地将`u.id`值当做了`supplier_organization_id`。 为了解决这个问题,开发者将`supplier_organization_id`提前到查询语句的最前面,如下所示: ```sql select orgr.supplier_organization_id as orgrm_supplier_organization_id, u.id as u_id, u.company_id as companyId, u.name, ... ur.supplier_user_id as supplier_user_id,ur.supplier_id as supplier_id from user u left join user_relation ur on u.id = ur.user_id left join user_organization_relation uor on u.id = uor.user_id left join organization_relation orgr on uor.organization_id = orgr.organization_id where orgr.supplier_id = #{supplierId} and u.company_id = #{companyId} and orgr.company_id=#{companyId} and uor.company_id = #{companyId} and u.name like '%#{name}%' and u.update_time > #{time} ``` 调整后的SQL语句,使得`supplier_organization_id`的选取在`u.id`之前,避免了MyBatis的混淆,从而得到正确的查询结果。 在MyBatis中,处理一对多关联时,我们需要确保SQL查询语句的顺序与映射文件中的`collection`配置保持一致,以保证数据能够正确映射。此外,还应确保在`resultMap`中正确设置了`association`和`collection`的属性,包括其对应的列名、Java类型和嵌套结果映射等信息。 MyBatis的`collection`元素用于处理一对多关系,而查询结果的正确性不仅取决于SQL查询,也依赖于MyBatis的映射配置。在遇到类似问题时,检查并调整SQL语句和映射文件的顺序,往往能解决问题。对于复杂的关联查询,更需要注意查询语句的编写和MyBatis配置的准确性,以确保数据的正确映射。
- 粉丝: 0
- 资源: 951
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助