mybatis三表连接查询数据重复问题

此问题的产生,主要是数据库的字段名一样导致

三张表   DOCTOR JOB OBJECT

有问题的查询语句和查询结果是:

   SELECT d.*,j.*,o.* from
		(select d.*,rownum r from DOCTOR d where rownum<=6) d
		join job j on d.job_id=j.id join object o on o.id=d.object_id
		where r>0
<img src="https://img-blog.youkuaiyun.com/20161020110037608?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
注意:查询结果中有6列是一样的id,name


修改为别名  

  SELECT d.*,j.name jobn,j.id jid,j.oid joid,o.id objid,o.name objn from
		(select d.*,rownum r from DOCTOR d where rownum<=6) d
		join job j on d.job_id=j.id join object o on o.id=d.object_id
		where r>0
<span style="color:#3366ff;">新的查询结果是:     注意看列名</span>
<span style="color:#3366ff;">
</span>
<span style="color:#3366ff;"><img src="https://img-blog.youkuaiyun.com/20161020110703515?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
</span>
此时依然不能解决数据重复问题,还需要修改resultMap的column属性名为别名


至此问题全部解决

### 关于MyBatis嵌套查询的实现 在处理关联对象加载时,MyBatis提供了两种方式来完成这一操作:Nested Select 和 Nested Results[^1]。 #### 使用Nested Select的方式 当采用`Nested Select`方式进行关联查询时,意味着会执行另一个已映射好的SQL语句以返回所需的复杂类型数据。例如,在获取公司信息的同时还需要获得其对应的员工列,则可以在定义公司的Mapper接口中的方法时指定通过子查询的方式来取得这些额外的信息: ```java @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="companyId", referencedColumnName="id") private Company company; // 对应的XML配置部分可能看起来像这样 <association property="company" column="companyId" select="getCompanyById"/> ``` 这里假设有一个名为`Employee`的对象含有指向`Company`实体的关系属性,并且该关系是多对一的形式;同时存在一个用于按ID检索公司的单独的方法`getCompanyById()`被用来作为内部调用的一部分[^2]。 对于具体的Java代码示例来说,如果想要基于上述描述创建相应的DAO层逻辑,可以参照下面的例子: ```java public interface EmployeeMapper { @Select("SELECT * FROM employee WHERE companyId=#{companyId}") List<Employee> findEmployeesByCompanyId(@Param("companyId") int companyId); } ``` 以及配合使用的`CompanyMapper.java`: ```java public interface CompanyMapper { @Results(id = "companyResults") @ConstructorArgs({ @Arg(column = "cid", javaType = Integer.class, id = true), @Arg(column = "name", javaType = String.class)}) @Select("select * from company where id = #{id}") Company getCompanyById(Integer id); // 嵌套查询employees @Select("<script>" + "SELECT c.* FROM company AS c LEFT JOIN ("+ "<foreach item='item' index='index' collection='list' open='(' separator='UNION ALL' close=')'>"+ "SELECT e.companyId as cid FROM employee e WHERE e.id = #{item}" + "</foreach>"+ ") t ON c.id=t.cid "+ "</script>") List<Company> listCompaniesWithEmployees(List<Integer> ids); } ``` 此段代码展示了如何利用`Nested Select`特性在一个查询中联合多个数据并最终形成包含有其他相关联记录的结果集。注意这里的最后一个例子是为了展示更复杂的场景而设计的一个动态SQL片段,它接受一系列员工ID参数并通过左连接(LEFT JOIN)找到它们所属的所有公司实例。 #### 使用Nested Results的方式 另一种选择即为`Nested Results`,这涉及到使用嵌入式的映射规则去解析重复出现的结果子集。这种方式通常适用于一对多或者多对多的情况,比如一个部门下有许多成员的情形。此时可以通过设置合适的`resultMap`标签及其下的`collection`元素来指示MyBatis怎样组装出完整的对象图结构。 考虑到以上提到的内容,为了更好地理解这两种不同的策略,请参考官方文档或者其他资源深入了解每种模式的具体应用场景和技术细节[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值