我希望下面的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>
但这显然是错误的。谢谢你的帮助!
答案 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">
但是在使用注释时我还没有发现指定这个语句选项。