2016-04-04 10 views
1

Ich kann nicht einen Weg zu finden, scheinen das Ergebnis Karte als KarteMybatis resultMap ist HashMap <String, Object>

My SQL ist

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

Jetzt i als Karte row_id brauchen, um (Schlüssel) und die anderen Spalten als Attribute einer Bean.

Ich möchte etwas wie meinen Code unten tun, aber ich kann nicht die richtige Syntax finden.

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

Irgendwelche Ideen?

Danke.

Antwort

0

Mybatis unterstützt die gewünschte Funktion nicht. Warum verwenden Sie java.util.Map einfach direkt als Ergebnismenge?

<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 

+0

Was ist der Schlüssel und Wert in diesem Fall? –

+0

Der Schlüssel ist der Aliasname des Tabellenfelds, wie * row_id *, * checkType * und der Wert ist der Abfrageergebniswert. – Blank

0

Es ist sehr einfach.

Wenn Sie Interface als Dao zu verwenden, müssen Sie diese Anmerkung hinzu:

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

Sie haben, in Ihrer Anfrage, eine Spalte mit einem Aliasnamen als "Schlüssel":

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

In Select Statement müssen Sie resultType mit Object-Klasse verlassen.

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

In meinem Fall, fügen Sie Hilfsklasse:

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

Und 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> 

Schließlich Einsatz wie folgt:

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