【问题标题】:Mybatis ResultMap is HashMap<String,Object>Mybatis ResultMap 是 HashMap<String,Object>
【发布时间】:2016-07-23 20:52:32
【问题描述】:

我似乎找不到将结果图作为地图获取的方法

我的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>

有什么想法吗?

谢谢。

【问题讨论】:

    标签: hashmap mybatis


    【解决方案1】:

    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
    

    【讨论】:

    • 这种情况下的关键和价值是什么?
    • key是表字段的别名,如row_id,checkType,value是你的查询结果值。
    • 别名的双引号对我有用,例如:MTC_CHK_TYP_CDE as "checkType"
    【解决方案2】:

    很简单。

    如果你使用Interface as Dao,你必须添加这个注解:

    @MapKey("key")
    public Map<String,Object> searchSomethings(... parameters ...);
    

    在您的查询中,您将有一个别名为“key”的列:

    SELECT
      column_key as key,
      foo_column as fooColumn,
      ...
    FROM table
    

    在选择语句中,您必须将 resultType 保留为 Object 类。

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

    【讨论】:

    • 唉,MySQL 有 key 作为保留字。 stackoverflow.com/questions/924265/…
    • 在引用关键字 (@Select("select sources.host as 'key', count(*) total ...") 后,它现在给出了nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'key' in 'class java.lang.String'
    【解决方案3】:

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

    /**
     * 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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 2014-01-30
      相关资源
      最近更新 更多