Mybatis plus 多表联查字段名重复报错 Column ‘id‘ in where clause is ambiguous
一、报错信息
Caused by: Column 'xxxx' in where clause is ambiguous
二、报错原因
表 person 和 表 class 都有字段 id 和 name ,所以要给它们增加别名来进行区分。
PersonVOMapper.java
public interface PersonVOMapper extends BaseMapper<PersonVO> {
List<PersonVO> getPersonVOList(@Param(Constants.WRAPPER) Wrapper<PersonVO> queryWrapper);
}
PersonVOMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sionas.mapper.PersonVOMapper">
<select id="getPersonVOList" resultType="com.sionas.domain.PersonVO">
SELECT
p.id AS personId,
p.name AS personName,
p.sex,
p.age,
c.id AS classId,
c.name AS className
FROM
person p
LEFT JOIN class c ON c.id = p.class_id;
${ew.customSqlSegment}
</select>
</mapper>
${ew.customSqlSegment}是Mybatis Plus的动态条件构造器的最终条件SQL
PersonServiceImpl.java
LambdaQueryWrapper<PersonVO> wrapper = new LambdaQueryWrapper<>();
wrapper.like(PersonVO::getPersonName, keyword)
.or().like(PersonVO::getClassName, keyword);
List<PersonVO> list = personVOMapper.getPersonVOList(wrapper);
此时会报错 Column ‘name’ in where clause is ambiguous,意思是 where子句中的列“name”是不明确的。
原因: 多表查询后字段 name 是重复的,查询结果集中含有两个 name 不知道是哪一个才是要查询的。条件语句是针对查询结果集的,所以此时的 字段重命名无效。
三、解决方法
方法一:
使用明确的字段名称 表名.字段名
LambdaQueryWrapper<PersonVO> wrapper = new LambdaQueryWrapper<>();
wrapper.like("p.name", keyword)
.or().like("c.name", keyword);
List<PersonVO> list = personVOMapper.getPersonVOList(wrapper);
方法二:
把查询结果作为子查询,然后再增加条件语句
SELECT
*
FROM (
SELECT
p.id AS personId,
p.name AS personName,
p.sex,
p.age,
c.id AS classId,
c.name AS className
FROM
person p
LEFT JOIN class c ON c.id = p.class_id
) AS result
${ew.customSqlSegment}
可以直接使用如下方式进行查询而不需要补全表名:
LambdaQueryWrapper<PersonVO> wrapper = new LambdaQueryWrapper<>();
wrapper.like(PersonVO::getPersonName, keyword)
.or().like(PersonVO::getClassName, keyword);
List<PersonVO> list = personVOMapper.getPersonVOList(wrapper);
Mybatis plus 多表联查字段名重复报错 Column ‘id‘ in where clause is ambiguous的更多相关文章
- MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突(转载)
本文转载自:http://www.cnblogs.com/jpf-java/p/6013307.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这 ...
- MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...
- MyBatis学习总结_04_解决字段名与实体类属性名不相同的冲突
一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), ...
- MyBatis学习笔记(四)——解决字段名与实体类属性名不相同的冲突
转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4264425.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演 ...
- Mybatis中多表联查,查询出来的字段出现重名,造成数据异常的解决方法!
在做一对多出现的问题,引发的思考:当数据库表中,主表的主键id和明细表的中的字段名相同时怎么办?Mybatis进行自动映射赋值的时候会不会出现异常? 注意:M ...
- MyBatis入门学习教程-解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...
- MyBatis学习总结4--解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定是完全相同的,如果直接在xml映射文件中使用sql进行映射,会造成返回值为空的情况,下面阐述解决方案: 测试所用表和数据 create t ...
- 【转】MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
[转]MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体 ...
- KO ------- 表中字段名和实体类属性名不一致
-----------------------siwuxie095 KO ------- 表中字段名和实体类属性名不一致 如果数据库表中的字段名和实体类的属性名不一致,那么在查询时, 相应字段的结果就 ...
- 四:MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...
随机推荐
- Pytorch 基于加权平滑过渡的无缝拼接
基于加权平滑过渡的无缝拼接 背景 在做照片数字人视频生成的时候,为了达到快速响应实时播放的需求,即视频的生成速度 必须小于 音频的播放速度. 因此,我们截取了一部分较小的可动区域进行推理生成,然后把生 ...
- CSS修改鼠标样式
CSS可以修改鼠标样式,即将鼠标移到元素上时,自动切换为其他样式或者自定义图片. 设置属性cursor为各种鼠标形态(把鼠标移到标签上看效果): 标签 对应形态 auto 自动选择 crosshair ...
- 基础控件(ListView,RecyclerView,单位和尺寸,ViewPager,ViewPager2)
ListView list_item.xml <?xml version="1.0" encoding="utf-8"?> <LinearLa ...
- c++中输出小数
首先 需要有#include<iomanip>这个头文件,因为它是输出输出流的格式控制 #include<iomanip> // 用于调用setprecision(n) 1 d ...
- Go语言学习 _基础001
Go语言学习 _基础001 HelloWorld package main // main 函数必须处于 main 包中 不管是在什么路径下 反正就是要有main包 import ( // 引入 包 ...
- house of banana
条件: 1.任意地址写一个堆地址 2.触发exit函数 3.能泄露堆地址和基地址 原理: 伪造 fini_array 赋值用到的结构体 从而控制程序exit时的程序执行流 ld.so 中存在 _rtl ...
- DOS批处理实验
DOS批处理实验 一. 实验目的 建立一个.bat文件,清理windows垃圾文件. 二. 实验内容和要求 在Windows环境下建立一个.bat文件实现对垃圾文件.安装程序.编辑文件时产生的临时文件 ...
- HJ17 坐标移动问题 ——秋招笔试
HJ17 坐标移动问题 华为笔试[难度中等] 问题描述: 开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动.从(0,0)点开始移动,从输入字符串里面读取一些坐标, ...
- 强化学习:如何计算被环境系统截断的terminated state的value值 —— (Bootstrap returns from value estimates if episode is terminated by timeout)
本文主题:如何计算强化学习中被环境系统截断的terminated state的value值 首先解释一下什么是强化学习中的terminated state的value值,强化学习就是一个智能体(age ...
- 从零开始学机器学习——K-Means 聚类
首先给大家介绍一个很好用的学习地址:https://cloudstudio.net/columns 在上一章节中,我们重点探讨了聚类的可视化分析方法,帮助我们更好地理解数据之间的关系和结构.今天,我们 ...