MyBatisPlus中使用SELECT关联查询时未添加别名报异常的问题分析与修复

简介: 本文记录了在使用MyBatis表写入自定义的SQL查询语句时发生的异常问题。当定义使用include对主表中的字段进行包装时,在之后需要用到使用主表的关联查询,要将整个主表中include包装的字段都添加上别名,否则就会报错。本文记录在第一次使用MyBatisPlus框架时遇到的问题,是一次踩坑经验,希望帮助大家避免这样的坑。

问题

  • 在MyBatisPlus中要使用到关联查询时,如果查询的主表字段不使用别名,会出现异常:
Column 'id' in field list is ambiguous

原因

  • 列ID在字段列表中重复,其实就是两张表有相同的字段,但是使用时表字段的名称前没有加表名,导致指代不明,前面加上前缀别名就没问题

新问题

  • 由于xml中已经用SQL封装好通用结果列,引用结果列方法:
 <include refid="Base_Column_List"></include>
  • 那么,如何给结果列添加别名呢?

解决办法

方法一

  • 在定义结果列的SQL语句中为使用了相同表字段的字段添加别名
  • 这样之后使用include标签引用时就是带别名引用

方法二

  • 使用include标签的property属性,为include标签中的字段添加别名
  • 使用 ${ } 占位符参数化的,占位符也可以被用在refid 属性里.不可以使用 #{ }
  • 此处的参数不是调用时传进来的,不同的属性值通过包含的实例而变化
<sql id="userColumns"> 
    ${alias}.id,
    username,
    password 
</sql>


<select id="selectUsers" resultType="map">
  select
    <include refid="userColumns"><property name="alias" value="t1"/></include>,
    <include refid="userColumns"><property name="alias" value="t2"/></include>
  from some_table t1
    cross join some_table t2
</select>

总结

  • 在mybatis的定义中 ,sql标签节点是用来定义可重用的SQL代码段
  • 可使用include标签节点来包含在其它语句里
  • 在include标签中可以使用property标签,将属性包含进来
相关文章
|
2月前
|
XML Java 数据库连接
mybatis中在xml文件中通用查询结果列如何使用
mybatis中在xml文件中通用查询结果列如何使用
111 0
|
2月前
|
Java 数据库连接 mybatis
Mybatis 多级分类查询
Mybatis 多级分类查询
35 0
|
2月前
|
SQL XML Java
【mybatis】第二篇:@Select注解中加入字段判断
【mybatis】第二篇:@Select注解中加入字段判断
|
2月前
|
SQL
MyBatis-Plus-Join关联查询
MyBatis-Plus-Join关联查询
147 2
|
2月前
|
SQL Java 关系型数据库
Mybatis多表关联查询与动态SQL(下)
Mybatis多表关联查询与动态SQL
79 0
|
2月前
|
SQL Java 数据库连接
Mybatis多表关联查询与动态SQL(上)
Mybatis多表关联查询与动态SQL
50 0
|
2月前
|
SQL 缓存 Java
mybatis 一对多查询
mybatis 一对多查询
51 0
|
2月前
|
SQL XML Java
MyBatis-Plus多表关联查询
MyBatis-Plus多表关联查询
135 0
|
3天前
|
Java 数据库连接 mybatis
Mybatis查询传递单个参数和传递多个参数用法
Mybatis查询传递单个参数和传递多个参数用法
19 11
MybatisPlus-标准CRUD制作,新增boolean save(T t),删除 ~ delete(int id),修改 ~ update(T t),根据id查询,T getById....
MybatisPlus-标准CRUD制作,新增boolean save(T t),删除 ~ delete(int id),修改 ~ update(T t),根据id查询,T getById....