MyBatis 联合查询结果中 product 为 null 的常见原因有以下几种:

  1. 数据库中 order_items 表的 productId 为 null:如果 order_items 表中存在 productId 为 null 的记录,那么在进行联合查询时,这些记录就不会与 products 表进行匹配,导致 product 属性为 null。

  2. 数据库中没有与 order_items 表的 productId 匹配的 products 数据:如果 order_items 表中存在 productId 对应的 products 数据不存在,那么在进行联合查询时,也会导致 product 属性为 null。

  3. 查询语句中 left join 写错或者没有写 join 条件:如果查询语句中 left join 写错或者没有写 join 条件,会导致查询结果不正确,从而导致 product 属性为 null。

解决方法:

  1. 检查 order_items 表的 productId 是否为 null:如果存在 productId 为 null 的记录,需要先排查这些记录并根据实际情况进行处理,例如修改 productId 或删除这些记录。

  2. 检查数据库中是否包含与 order_items 表的 productId 匹配的 products 数据:如果数据库中没有匹配的 products 数据,需要确认是否漏掉了数据,或者需要添加相应的 products 数据。

  3. 检查查询语句中的 left join 是否正确:确保 left join 语法正确,并且写了正确的 join 条件,例如 left join products p on oi.product_id = p.id

示例代码:

<?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.ecommerce.book.mapper.OrderItemsMapper'>

    <resultMap id='BaseResultMap' type='com.ecommerce.book.pojo.OrderItems'>
            <id property='id' column='id' jdbcType='INTEGER'/>
            <result property='orderId' column='order_id' jdbcType='INTEGER'/>
            <result property='productId' column='product_id' jdbcType='INTEGER'/>
            <result property='quantity' column='quantity' jdbcType='INTEGER'/>
            <result property='price' column='price' jdbcType='DECIMAL'/>
            <result property='createdAt' column='created_at' jdbcType='TIMESTAMP'/>
            <result property='updatedAt' column='updated_at' jdbcType='TIMESTAMP'/>
        <association property='products' javaType='com.ecommerce.book.pojo.Products'>
            <id property='id' column='product_id' jdbcType='INTEGER'/>
            <result property='name' column='name' jdbcType='VARCHAR'/>
            <result property='description' column='description' jdbcType='VARCHAR'/>
            <result property='price' column='price' jdbcType='DECIMAL'/>
            <result property='categoryId' column='category_id' jdbcType='INTEGER'/>
            <result property='imageUrl' column='image_url' jdbcType='VARCHAR'/>
            <result property='stock' column='stock' jdbcType='INTEGER'/>
            <result property='isFeatured' column='is_featured' jdbcType='TINYINT'/>
            <result property='createdAt' column='created_at' jdbcType='TIMESTAMP'/>
            <result property='updatedAt' column='updated_at' jdbcType='TIMESTAMP'/>
            <result property='weight' column='weight' jdbcType='DECIMAL'/>
            <result property='brand' column='brand' jdbcType='VARCHAR'/>
            <result property='supplier' column='supplier' jdbcType='INTEGER'/>
            <result property='origin' column='origin' jdbcType='VARCHAR'/>
            <result property='isActive' column='is_active' jdbcType='TINYINT'/>
            <result property='isDeleted' column='is_deleted' jdbcType='TINYINT'/>
        </association>
    </resultMap>


    <sql id='Base_Column_List'>
        id,order_id,product_id,
        quantity,price,created_at,
        updated_at
    </sql>
    <insert id='insertOrderItem'>
        insert into order_items
        (order_id,product_id,quantity,price,created_at,updated_at)
        values
        (#{orderId},#{productId},#{quantity},#{price},#{createdAt},#{updatedAt})
    </insert>
    <select id='selectByOrderId' resultType='com.ecommerce.book.pojo.OrderItems'>
        select
        oi.id,oi.order_id,oi.product_id,oi.quantity,oi.price,oi.created_at,oi.updated_at,
        p.name,p.description,p.price,p.category_id,p.image_url,p.stock,p.is_featured,p.created_at,p.updated_at,p.weight,p.brand,p.supplier,p.origin,p.is_active,p.is_deleted
        from order_items oi
        left join products p on oi.product_id = p.id
        where oi.order_id = #{orderId}

    </select>
</mapper>

通过仔细检查以上几个方面,就能找到 product 为 null 的原因并进行修复。

MyBatis 联合查询结果 Product 为 Null 的原因和解决方法

原文地址: https://www.cveoy.top/t/topic/nDLc 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录