关于springboot:Mybatis-plus-多表联查Column-‘id‘-in-where-clause-is-ambiguous-转载

10次阅读

共计 1905 个字符,预计需要花费 5 分钟才能阅读完成。

转载自 https://blog.csdn.net/qq_3383…

一、报错信息
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);

————————————————
版权申明:本文为 CSDN 博主「Siona_xin」的原创文章,遵循 CC 4.0 BY-SA 版权协定,转载请附上原文出处链接及本申明。
原文链接:https://blog.csdn.net/qq_3383…

正文完
 0