• 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);
    
    
     
     
  • 相关阅读:
    Oracle存储过程
    Oracle触发器
    Oracle伪列
    Oracle索引
    Oracle视图
    Oracle数据库链路
    异常处理之动手动脑
    四则运算自动出题之javaweb版
    继承与多态之动手动脑
    javaweb之添加学生信息
  • 原文地址:https://www.cnblogs.com/exmyth/p/14369896.html
Copyright © 2020-2023  润新知