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 BaseMapperPersonVO {
ListPersonVO getPersonVOList(@Param(Constants.WRAPPER) WrapperPersonVO 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
LambdaQueryWrapperPersonVO wrapper = new LambdaQueryWrapper();
wrapper.like(PersonVO::getPersonName, keyword)
.or().like(PersonVO::getClassName, keyword);
ListPersonVO list = personVOMapper.getPersonVOList(wrapper);
此时会报错Column ‘name’ in where clause is ambiguous,意思是where子句中的列“name”是不明确的。
原因: 多表查询后字段name是重复的,查询结果集中含有两个name不知道是哪一个才是要查询的。条件语句是针对查询结果集的,所以此时的字段重命名无效。
三、解决方法
方法一:
使用明确的字段名称表名.字段名
LambdaQueryWrapperPersonVO wrapper = new LambdaQueryWrapper();
wrapper.like("p.name", keyword)
.or().like("c.name", keyword);
ListPersonVO 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}
可以直接使用如下方式进行查询而不需要补全表名:
LambdaQueryWrapperPersonVO wrapper = new LambdaQueryWrapper();
wrapper.like(PersonVO::getPersonName, keyword)
.or().like(PersonVO::getClassName, keyword);
ListPersonVO list = personVOMapper.getPersonVOList(wrapper);
Mybatis plus 多表联查字段名重复报错 Column ‘id‘ in where clause is ambiguous 相关文章
Mybatis异常There is no getter for property named XXX in class java.lang.String
Mybatis版本:mybatis-3.0.6.jar 1.当入参为 string 类型时 (包括java.lang.String.) 我们使用#{xxx}引入参数.会抛异常There is no getter for property named 'XXX' in 'class java.lang.String' select id="getBookingCount" resultType="int" parameterTyp
关于 mybatis 的 @MapperScan 用法心得
1. 必需引用 mybatis-spring-boot-starter, 否则不能扫描生效。可以用 mybatis-plus 的 mybatis-plus-boot-starter 替代。 2. 从网上搜 MapperScan,大部分说是通过 basePackage 指定扫描多个包,本身没问题,但不是一个完美的方案。原因如下: (1)如果扫
SQL* Plus 或 PL/SQL Developer 连接oracle数据库
前置步骤 确认你的oracle数据库的版本和位数,例如:11.02g x64位 下载oracle官网提供的客户端,使用高于或等于服务器版本的即可,一般是最新版:https://www.oracle.com/cn/database/technology/winx64soft.html 解压到你的文件夹,例如:D:\Program Files\
五分钟快速上手MyBatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。 可以通过简单的 XML 或注解来配置和映射,Java POJO(Plain Old Java Objects)为数据库中的记录。 1 、Maven依赖
6.初识MyBatis
MyBatis是当前主流的Java持久层框架之一。 6.1什么是Mybatis MyBatis框架也被称为ORM(对象关系映射)框架,所谓的ORM就是一种为了解决面向对象和关系型数据库数据类型不匹配的技术,通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象
mybatis关联查询,多对一与一对多
多对一查询: 表结构: CREATE TABLE `teacher` ( `id` INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, PRIMARY KEY (`id`))#教师表CREATE TABLE `student` ( `id` INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, `tid` INT(10) DEFAULT NULL, P
mybatis 拼接的字符串查询失效原因以及解决方案
java 代码 String a="'1','2'"; xml sql select id="queryByCardIds" resultType="java.util.Map" parameterType="java.lang.String" select * from user where id in (#{a}) /select 执行过程: mybatis 是sql动态绑定,当传入一个字符串参数时,框架转换成
Mybatis整合Spring之MapperFactoryBean简单分析
MapperFactoryBean分析: MapperFactoryBean的运作原理到底是什么 继承关系如下图所示: 分析: 1.FactoryBean可以整合到Spring中,其中内部 getObject() 就是实际注册到容器中的对象,getObjectType()就是注册到容器中的类型 2.另外层层集成直到实现Initial
SSM-Mybatis入门篇
Mybatis 环境: JDK1.8 Mysql maven IDEA 回顾: JDBC Mysql java基础 Maven Junit ssm框架: 1.简介 1.1什么是Mybatis MyBatis 是一款优秀的 持久层框架 , 它支持自定义 SQL、存储过程以及高级映射。 MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获
Mybatis学习笔记
第一章 Mybatis介绍 下载:https://github.com/mybatis/mybatis-3/releases Mybatis是apache下的顶级项目。 MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建co