MyBatis - 返回HashMap

时间:2015-03-23 18:07:25

标签: mybatis

我希望下面的select语句的返回结果为Map<String, Profile>:

<select id="getLatestProfiles" parameterType="string" resultMap="descProfileMap">
    select ml.layerdescription, p1.* 
    from ( select max(profile_id) as profile_id
        from SyncProfiles
        group by map_layer_id) p2
    inner join SyncProfiles p1 on p1.profile_id = p2.profile_id
    inner join maplayers ml on ml.LAYERID = p1.MAP_LAYER_ID
    where ml.maxsite = #{site} 
</select>

我已经看到这个post将String映射到自定义类,但键是自定义类的一部分。在上面的查询中,layerdescription字段不是Profile类的一部分,因为我的目标是让Profile类严格地表示syncprofiles表,而layerdescription字段在另一个表中。

我的界面如下:

public Map<String, Profile> getLatestProfiles(final String site);

如何定义descProfileMap?我想做点什么:

<resultMap id="descProfileMap" type="java.util.HashMap">
    <id property="key" column="layerdescription" />
    <result property="value" javaType="Profile"/>
</resultMap>

但这显然是错误的。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

实现这一目标需要两个步骤:

- 使用关联和嵌套的resultMap:

<resultMap type="Profile" id="profileResultMap">
     <!-- columns to properties mapping -->
</resultMap
<resultMap type="map" id="descProfileMap">
    <id property="key" column="layerdescription" />
    <association property="value" resultMap="profileResultMap" />
</resultMap>

- 使用 ResultHandler 将每条记录添加到具有预期结构的Map:

final Map<String, Profile> finalMap = new HashMap<String, Profile>();

        ResultHandler handler = new ResultHandler() {
            @Override
            public void handleResult(ResultContext resultContext) {
                Map<String, Object> map = (Map) resultContext.getResultObject();
                finalMap.put(map.get("key").toString()), (Profile)map.get("value"));
            }
        };

session.select("getLatestProfiles", handler);

如果按原样运行,可能会引发此异常:

  

org.apache.ibatis.executor.ExecutorException:使用的映射语句   嵌套的结果映射无法安全地与自定义一起使用   ResultHandler。使用safeResultHandlerEnabled = false设置绕过   检查或确保您的语句返回有序数据和设置   resultOrdered = true就可以了。

然后按照建议,您可以在Mybatis config中全局禁用检查:

根据文件:

  

safeResultHandlerEnabled:允许在嵌套语句中使用ResultHandler。如果允许,请设置   假。默认值:true。

<settings>
    <setting name="safeResultHandlerEnabled" value="false"/> 
</settings> 

或指定您的结果在声明中订购:

文档说明:

  

resultOrdered这仅适用于嵌套结果选择   语句:如果这是真的,则假定嵌套结果为   包含或组合在一起,以便在新的主结果行时   返回,不会再出现对前一个结果行的引用。   这允许嵌套结果填充更多内存友好。   默认值:false。

<select id="getLatestProfiles" parameterType="string" resultMap="descProfileMap" resultOrdered="true">

但是在使用注释时我还没有发现指定这个语句选项。