2012-07-15 33 views
2

領域我想將數據映射到java.util.Map屬性與MyBatis的。我有這樣的簡單POJO:地圖java.util.Map與MyBatis的

public class Bar { 
    ...fields 
} 

public class Foo { 
    private Map<String, Bar> bars; 

    public Foo() { 
     bars = new HashMap<String, Bar>(); 
    } 

    ... 

} 

如何使用MyBatis將數據映射到酒吧?下面的示例不起作用,因爲它始終將新映射設置爲字段。

<resultMap id="fooResultMap" type="Foo"> 
    ...attributes 
    <association property="bars" resultMap="barResultMap" /> 
</resultMap> 

<resultMap id="barResultMap" type="map"> 
     <result property="key" column="bar_key" /> 
    <association property="value" javaType="Bar"> 
    ...attributes 
    </association> 
</resultMap> 
+1

應在fooResultMap協會resultMap的是指向barResultMap,而不是priceMapResultMap?我不明白「價格」在你的問題中扮演什麼角色。你想用許多酒吧填充Foo作爲地圖,而不是列表,對吧? – quux00 2012-07-15 23:58:56

+0

嗨,感謝那是錯字,我糾正了它。你是對的我想用許多酒吧填滿Foo作爲地圖,而不是一個List,但不能讓它正常工作。 – 2012-07-16 06:53:06

+0

好的,下一個問題 - 1)數據庫中的foos和bar之間是否存在1:多的關係? (1 Foo可以有很多酒吧)? 2)在你的SQL映射中,你是否把這兩個都拉回到單個查詢中? 3)當你說它不起作用,因爲「它總是設置新的地圖到領域」,你的意思是它覆蓋了你在Foo構造函數中創建的「酒吧」地圖 - 否則它會返回地圖或當前返回的地圖? – quux00 2012-07-16 13:06:25

回答

3

我已經做了一些這方面的研究,並要求對谷歌的MyBatis組,因爲我很感興趣的是如何做到這一點我自己。

在當前的時間,這似乎是不可能的。如果您想使用<collection>映射在Foo對象中使用List<Bar>,則可以輕鬆使其工作。

我試着用<collection>返回一個地圖,但它不明白我在問它做。

我現在唯一知道這樣做的方法是用兩個查詢/映射自己管理它 - 一個用來填充Foo的所有字段而不是它的Bars集合。然後,像下面列出的一個回拉的所有酒吧在地圖並把它插入到您的Foo查詢映射對象自己:

@Select("SELECT bar_id, bar_name FROM bar WHERE foo_id = #{id}") 
@MapKey("bar_name") 
Map<String, Bar> getBarsById(int id); 

這將返回一個Map,把一個條目每個酒吧,在那裏的關鍵條目是「bar_name」列的值。

MyBatis的團隊推薦的發行請求把這個功能在未來的版本。

+0

感謝您的研究。我也做了我自己的,但沒有找到更好的東西。我最終用Java代碼構建地圖。如果你可以發佈鏈接到功能請求,它可能會很好。也許它可以幫助後者。 – 2012-07-24 23:19:45

-11

關於MyBatis和HashMap,實際上它就是這樣。

HashMap類實現Map。 圖是一個inteface

因此因爲HashMap實現了Map,HashMap是一個Map。

無論您使用泛型鍵,價值在它到底要不要也。

http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html

+0

我不明白你的意思...... – 2012-07-15 22:51:26

+0

因爲沒有意義...... – om39a 2012-11-25 04:14:23