php 多表联查给id起别名,Mybatis plus 多表联查字段名重复报错 Column ‘id‘ in where clause is ambiguous...

本文介绍了在使用MybatisPlus进行多表联查时遇到的字段名重复导致的错误,如Column 'id' in where clause is ambiguous。分析了错误原因,是因为多张表存在相同字段名,使得查询条件无法确定具体来源。提供了两种解决方案:一是直接使用表名.字段名的方式明确字段来源;二是将查询结果作为子查询,再进行条件构造。并给出了具体的代码示例。
摘要由CSDN通过智能技术生成

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis-Plus 中进行多表联查时,可以使用 `@TableField` 注解指定要查询的字段,并在实体类中定义对应的属性。 假设我们有两张:`user` 和 `order` ,它们的关系是一对多,一个用户可以拥有多个订单。现在我们需要查询用户的信息和他的订单总数,然后将订单总数更新到用户中的一个字段中。 首先,定义一个实体类 `User`,并在其中添一个属性 `orderCount`,用来存储订单总数: ``` @Data public class User { private Long id; private String name; private Integer age; @TableField(exist = false) private Integer orderCount; // 订单总数 } ``` 其中,`@TableField(exist = false)` 示该属性不是数据库中的字段。 然后,使用 Mybatis-Plus 提供的 `Wrapper` 类进行多表联查,并计算订单总数: ``` QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.select("user.*, COUNT(order.id) as order_count") .eq("user.id", userId) .leftJoin("order", "user.id=order.user_id") .groupBy("user.id"); User user = userMapper.selectOne(wrapper); if (user != null) { user.setOrderCount(orderCount); userMapper.updateById(user); } ``` 在 `wrapper.select()` 方法中,我们使用了 SQL 的聚合函数 `COUNT()` 来计算订单总数,并使用 `as` 关键字给计算结果取了一个别名 `order_count`。然后,在 `wrapper.leftJoin()` 方法中,指定了要联查的和联查条件。最后,在 `wrapper.groupBy()` 方法中,指定了分组条件。 查询出用户信息后,将订单总数设置到 `User` 对象中,并使用 `userMapper.updateById()` 方法将修改后的数据更新到数据库中。 以上就是使用 Mybatis-Plus 进行多表联查并修改字段的方法。注意,这里的 `orderCount` 属性不是数据库中的字段,因此需要使用 `@TableField(exist = false)` 注解标识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值