如何通过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和数量存入itemsHashMap中。 - 类型指定:确保
javaType和type属性中的包路径与你的实际项目包名一致,比如com.yourpackage需要替换成你自己的包路径。
内容的提问来源于stack exchange,提问作者Ilya Lisov
相关产品推荐
相关产品推荐

