2011-11-25 65 views
2

我無法弄清楚如何在複雜的對象中使用mybatis結果。嵌套的mybatis地圖

我有以下的映射器類:

public interface StationMapper { 
    @MapKey("stationId") 
    Map<Integer,Station> getStations(); 
} 

這是從下面的結果映射建:

<resultMap id="stationMap" type="Station"> 
    <result column="station_id" property="stationId" /> 
    <result column="another_id" property="notUniqueId" /> 
    <result column="name" property="name" /> 
</resultMap> 

不是地圖,我想爲getStations返回類型()來是一個將地圖(或集合)作爲構造函數的對象,以便我可以在對象構造上執行一些代碼。

public class FancyStationMapHolder { 
    public FancyStationMapHolder(Map<Integer,Station> stations) { 
     executeSpecialCode(stations); 
    } 
    // OR 
    public FancyStationMapHolder(Collection<Station> stations) { 
     executeSpecialCode(stations); 
    } 
} 
public interface StationMapper { 
    FancyStationMapHolder getStations(); 
} 

我不認爲我可以使用<結果映射> <集合>元素(和我試過),因爲沒有實際數據的關係。

或者,我想一個StationMapper方法與此簽名:

@MapKey("notUniqueId") 
Map<String,Collection<Station>> getStationsByNotUniqueId(); 

編輯: 如果我限制它基於一些列我能得到這個複雜的對象,設置屬性,而不是使用一個構造函數,但是我怎麼能沒有關係限制呢?

<resultMap id="fancyMap" type="sample.FancyStationMapHolder"> 
    <result column="someId" property="someId"/> 
    <collection property="stations" column="someId" resultMap="stationMap" 
    select="stations" javaType="ArrayList" /> 
</resultMap> 

我更喜歡使用構造函數,所以我會很感激這方面的建議。下面的設置導致此異常:

org.mybatis.spring.MyBatisSystemException: 
nested exception is org.apache.ibatis.reflection.ReflectionException: 
Error instantiating class sample.FancyStationMapHolder with invalid types 
    (ArrayList,) or values ([... 

<resultMap id="fancyMap" type="sample.FancyStationMapHolder"> 
    <constructor> 
    <arg column="someId" resultMap="stationMap" select="stations" 
     javaType="ArrayList" /> 
    </constructor> 
    <result column="someId" property="someId"/> 
</resultMap> 

回答

0

的MyBatis確實對應欄的一項偉大的工作,以POJO屬性和做額外的工作一點點票友映射。但總的來說,我建議不要試圖通過MyBatis將業務邏輯映射到映射/編組。我自己走過這條路,大部分都是從映射器中得到我需要的,但後來將它全部取消了。

因此,只需從您的映射器方法獲得List<Station>,並將其轉換爲您需要這些東西的DAO或控制器或服務中的專用轉換器方法中所需的模型。覆蓋具有至少一個抽象層的映射器幾乎總是更好的,它將多個更新合併到單個事務中,處理樂觀鎖定,隱藏內部幫助容器,高級緩存邏輯等。

一個好處是,這樣的代碼將更容易維護,下一個開發人員不必深入MyBatis映射的特性。此外,抓住List<Station>還可以重新用於其他用途相同的查詢,它緩存合理地等

如果List<Station>需要太多資源和查詢是一個關鍵的性能路徑上,使用的MyBatis ResultHandler遍歷JDBS的ResultSet 。