Mybatis使用关联查询由于表名字段重复导致的问题

项目场景:

Mybatis使用关联查询由于表名字段重复导致的问题


问题描述:

下面代码可以看出Brand和Category表中有了重复的name字段。当我们进行关联查询时,发现category的name属性竟然赋予了外边brand的name的值。

@Data
public class Brand {
    private Long brandId;
    private String name;
    private String descript;
    private Category category;
}

@Data
public class Category{
    private Long id; //表:cat_id
    private String name; //表:name
    private Long pid; //表:parent_cid
}

在这里插入图片描述
在这里插入图片描述


原因分析:

在使用mybatis进行多表联合查询时,如果两张表中的字段名称形同,会出现无法正常映射的问题


解决方案:

改写sql语句给这个重复的字段起别名,然后映射的字段名也相应修改成别名即可
在这里插入图片描述

<resultMap id="brandCategoryMap" type="com.zcc.domain.Brand">
        <id property="brandId" column="brand_id"></id>
        <result property="name" column="name"></result>
        <result property="descript" column="descript"></result>
        <association property="category" javaType="com.zcc.domain.Category">
            <id property="id" column="cat_id"></id>
            <result property="name" column="cname"></result>
            <result property="pid" column="parent_cid"></result>
        </association>
    </resultMap>
    <select id="selectBrandAndCategory" resultMap="brandCategoryMap">
        select pb.*,pc.cat_id,pc.name cname,pc.parent_cid
        from pms_brand pb join pms_category pc on pb.catalog_id=pc.cat_id
        where brand_id=#{brandId}
    </select>

最后测试:

在这里插入图片描述

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis Plus实现多联查有两种方式:使用MyBatis Plus的Wrapper类或者使用MyBatis原生的@Results和@ResultMap注解。 1. 使用Wrapper类 使用Wrapper类可以方便地实现多联查,具体步骤如下: (1)创建Wrapper对象,例如: ``` QueryWrapper<User> wrapper = new QueryWrapper<>(); ``` (2)使用Wrapper对象进行多联查,例如: ``` wrapper.select("user.id", "user.name", "user.age", "order.order_no") .leftJoin("order", "order.user_id = user.id") .eq("user.id", 1); ``` 其中,select方法用于指定查询的列,leftJoin方法用于指定关联关联条件,eq方法用于指定查询条件。 2. 使用@Results和@ResultMap注解 使用@Results和@ResultMap注解可以实现更灵活的多联查,具体步骤如下: (1)在Mapper接口中定义查询方法,并使用@Select注解指定SQL语句和返回类型,例如: ``` @Select("SELECT u.id, u.name, u.age, o.order_no FROM user u LEFT JOIN order o ON u.id = o.user_id WHERE u.id = #{userId}") @Results(id = "userOrderMap", value = { @Result(column = "id", property = "id"), @Result(column = "name", property = "name"), @Result(column = "age", property = "age"), @Result(column = "order_no", property = "orderNo") }) UserOrderDTO getUserOrderById(@Param("userId") Long userId); ``` 其中,@Results注解用于定义返回结果的映射关系,@Result注解用于定义列名和属性名的对应关系。 (2)在Mapper接口中定义返回结果的DTO类,例如: ``` public class UserOrderDTO { private Long id; private String name; private Integer age; private String orderNo; // 省略getter和setter方法 } ``` (3)在XML配置文件中使用@ResultMap注解引用上述定义的映射关系,例如: ``` <resultMap id="userOrderMap" type="com.example.dto.UserOrderDTO"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="age" property="age"/> <result column="order_no" property="orderNo"/> </resultMap> ``` 使用以上两种方式可以方便地实现多联查。需要注意的是,在进行多联查时,需要注意列名的唯一性,避免重复列名导致查询失败。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值