You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过MyBatis XML查询获取包含Map<Item, Long>的Cart对象

解决MyBatis映射Cart对象(包含HashMap<Item, Long>)的问题

要实现从数据库查询并映射出包含HashMap<Item, Long>的Cart对象,你需要在MyBatis XML映射文件中配置对应的结果映射(ResultMap),以下是完整的代码示例和关键说明:

1. 配置Item的ResultMap(复用映射规则)

<resultMap id="ItemResultMap" type="com.yourpackage.Item">
    <id column="item_id" property="id"/>
    <result column="item_name" property="name"/>
    <result column="item_description" property="description"/>
    <result column="item_price" property="price" javaType="java.math.BigDecimal"/>
    <result column="item_type" property="type" javaType="com.yourpackage.ItemType"/>
    <result column="item_available" property="available"/>
</resultMap>

2. 配置Cart的ResultMap(包含HashMap映射)

<resultMap id="CartWithItemsResultMap" type="com.yourpackage.Cart">
    <id column="cart_id" property="id"/>
    <!-- 映射items字段:HashMap<Item, Long> -->
    <collection property="items" 
                javaType="java.util.HashMap"
                ofType="java.util.Map.Entry"
                resultMap="ItemEntryResultMap"/>
</resultMap>

<!-- 映射Map.Entry对象,key为Item,value为商品数量 -->
<resultMap id="ItemEntryResultMap" type="java.util.Map.Entry">
    <association property="key" resultMap="ItemResultMap"/>
    <result property="value" column="item_quantity" javaType="java.lang.Long"/>
</resultMap>

3. 配置查询语句

将你原有的SQL语句关联到上面的ResultMap:

<select id="getCartById" resultMap="CartWithItemsResultMap">
    SELECT c.id          as cart_id,
           i.id          as item_id,
           i.name        as item_name,
           i.description as item_description,
           i.price       as item_price,
           i.type        as item_type,
           i.available   as item_available,
           ci.quantity   as item_quantity
    FROM carts c
             JOIN carts_items ci ON c.id = ci.cart_id
             LEFT JOIN items i on i.id = ci.item_id
    WHERE c.id = #{id}
</select>

关键注意事项

  • Item类的equals/hashCode实现:因为Item作为HashMap的key,必须保证逻辑相等性。你使用的@Data注解会自动基于所有字段生成这两个方法,确保同一id的Item会被识别为HashMap的同一个key,避免重复存储。
  • MyBatis的结果合并逻辑:MyBatis会根据Cart的id(cart_id)自动合并同一条购物车的多条查询结果,将对应的Item和数量存入items HashMap中。
  • 类型指定:确保javaType和type属性中的包路径与你的实际项目包名一致,比如com.yourpackage需要替换成你自己的包路径。

内容的提问来源于stack exchange,提问作者Ilya Lisov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:00:57