我花了好几天(和晚上)没有运气,试图找出一种使用MyBatis中的Map集合映射查询结果的方法(v.3.3.1)问题是MyBatis返回一组列表/一组地图而不是实际的地图,即行列表映射到地图列表,每列的列名称用作键,每列内容作为地图的值。
我知道你可以使用" ResultHandler"操纵每个返回行的映射,但这意味着在实体中使用临时字段并分配由" ResultHandler"构建的实际映射。因为我的实体包含其他字段和集合,或者可能会生成两个单独的查询和单独的resultMaps但我不喜欢它。我知道还有一个"selectMap()"
方法但是它们都没有构建&# 34;真"键/值对的映射,我无法使用它,原因与上述相同(我希望继续使用"selectOne()"
立即检索实体及其所有字段的填充)。
最后,我推出了这个"解决方法" (又名代码气味):公开自定义HashSet的内部地图,如下图所示:
https://gist.github.com/pnavais/81a83dea3b0fb190fab01b5a5de9b7d1
并将列映射到resultMap中设置的属性,如下所示:
<collection property="properties" javaType="org.payball.db.core.collection.MapHackSet" ofType="Map.Entry">
<id property="key" column="PROP_KEY"/>
<result property="value" column="PROP_VALUE"/>
</collection>
从MyBatis中检索后,我可以将Set设置为地图,如下所示:
MapHackSet<String, String> properties = entityFound.getProperties();
properties.get("key");
显然这是一种hackish和极其丑陋,所以我请求一个有效的解决方法,以从MyBatis获取实际的地图。