MyBatis 联合查询结果 Product 为 Null 的原因和解决方法
MyBatis 联合查询结果中 product 为 null 的常见原因有以下几种:
-
数据库中 order_items 表的 productId 为 null:如果 order_items 表中存在 productId 为 null 的记录,那么在进行联合查询时,这些记录就不会与 products 表进行匹配,导致 product 属性为 null。
-
数据库中没有与 order_items 表的 productId 匹配的 products 数据:如果 order_items 表中存在 productId 对应的 products 数据不存在,那么在进行联合查询时,也会导致 product 属性为 null。
-
查询语句中 left join 写错或者没有写 join 条件:如果查询语句中 left join 写错或者没有写 join 条件,会导致查询结果不正确,从而导致 product 属性为 null。
解决方法:
-
检查 order_items 表的 productId 是否为 null:如果存在 productId 为 null 的记录,需要先排查这些记录并根据实际情况进行处理,例如修改 productId 或删除这些记录。
-
检查数据库中是否包含与 order_items 表的 productId 匹配的 products 数据:如果数据库中没有匹配的 products 数据,需要确认是否漏掉了数据,或者需要添加相应的 products 数据。
-
检查查询语句中的 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 的原因并进行修复。
原文地址: https://www.cveoy.top/t/topic/nDLc 著作权归作者所有。请勿转载和采集!