Mybatis ResultMap是HashMap

Mybatis ResultMap是HashMap,hashmap,mybatis,Hashmap,Mybatis,我似乎找不到一种方法将结果映射作为映射 我的sql是 <select id="retrievePackageHeader" parameterType="java.lang.String" resultType="PackageHeaderMap"> SELECT CONCAT(SCE_WRK_CTRL_NB, AC_CRR_CDE) as row_id, MTC_CHK_TYP_CDE, PLNR_REVW_IND, PLNR_OWD_IND,

我似乎找不到一种方法将结果映射作为映射

我的sql是

<select id="retrievePackageHeader" parameterType="java.lang.String" resultType="PackageHeaderMap">
    SELECT CONCAT(SCE_WRK_CTRL_NB, AC_CRR_CDE) as row_id, 
    MTC_CHK_TYP_CDE, 
    PLNR_REVW_IND, 
    PLNR_OWD_IND, 
    PKG_SLOT_TYP_CDE 
    FROM WSM_PKG_HDR WHERE AC_NB = '${value}';
    WITH UR
</select>
现在我需要row_id作为映射键,其他列作为bean的属性

我想执行下面的代码,但找不到正确的语法

 <resultMap id="PackageBeanResult"              type="PackageBean">
    <result property="checkType"                column="MTC_CHK_TYP_CDE"/>
    <result property="plannerReview"            column="PLNR_REVW_IND"/>
    <result property="plannerOwned"             column="PLNR_OWD_IND" />
    <result property="slotType"                 column="PKG_SLOT_TYP_CDE" />
 </resultMap>

 <resultMap id="PackageHeaderMap"               type="java.util.HashMap">
    <result property="java.lang.String"         column="row_id"/>
    <result property="object"                   resultMap="PackageBeanResult"/>
 </resultMap>
有什么想法吗


谢谢

Mybatis不支持您想要的功能。为什么直接使用java.util.Map作为结果集

<select id="retrievePackageHeader" parameterType="java.lang.String" resultType="java.util.Map">
SELECT CONCAT(SCE_WRK_CTRL_NB, AC_CRR_CDE) as row_id, 
MTC_CHK_TYP_CDE as checkType, 
PLNR_REVW_IND as plannerReview, 
PLNR_OWD_IND as plannerOwned, 
PKG_SLOT_TYP_CDE as slotType
FROM WSM_PKG_HDR WHERE AC_NB = '${value}';
WITH UR
这很简单

如果将接口用作Dao,则必须添加以下注释:

@MapKey("key")
public Map<String,Object> searchSomethings(... parameters ...);
在SelectStation中,必须将resultType保留为Object类

<select id="searchSomethings" resyltType="ObjectClass">
  ...
</select>

在我的例子中,添加助手类:

/**
 * Helper converting list to map.
 * @param <K> key
 * @param <V> value
 */
@Getter
public class MappingHelper<K, V> {
    private K key;
    private V value;

    /**
     * Return map from {@link MappingHelper} list.
     * @param list DTO list
     * @param <K> key
     * @param <V> value
     * @return map
     */
    public static <K, V> Map<K, V> toMap(List<MappingHelper<K, V>> list) {
        if (list == null) {
            return Collections.emptyMap();
        }
        return list.parallelStream().collect(Collectors.toMap(MappingHelper::getKey, MappingHelper::getValue));
    }
}
以及init mapper.java:

List<MappingHelper<Integer, String>> getNames(@Param("ids") List<Integer> Ids);
mapper.xml:

<resultMap id="nameMap" type="package.model.MappingHelper">
    <id     property="key"   column="id"/>
    <result property="value" column="nm"/>
</resultMap>

<select id="getNames" resultMap="nameMap">
    SELECT id, nm
    FROM name_table
    WHERE id IN <foreach item="id" collection="ids" open="(" separator="," close=")">#{id}</foreach>
</select>
最后,按如下方式使用:

Map<Integer, String> names = MappingHelper.toMap(mapper.getNames(ids));

在这种情况下,键和值是什么?键是表字段的别名,如row_id、checkType,值是您的查询结果值。别名的双引号对我有用,如:MTC_CHK_TYP_CDE as checkTypeAlas,MySQL将键作为保留字。在引用关键字@selectselectsources.host作为“key”,count*total…,它现在给出嵌套的异常是org.apache.ibatis.reflection.ReflectionException:在“class java.lang.String”中没有名为“key”的属性的getter。
Map<Integer, String> names = MappingHelper.toMap(mapper.getNames(ids));