2012-04-26 59 views
3

我有這樣使用MyBatis的註解擷取嵌套對象

class foo 
{ 
private String id; 
private String attribute; 
private Map<String, String> dataMap; 
} 

而我的數據模型中的POJO是

Table Item 
- INT id 
- CHAR attribute 

//存儲數據地圖作爲鍵 - 值對

Table Data 
- INT id 
- CHAR key 
- CHAR value 

現在,我想結合以下2個查詢

第一次查詢:

@Select("select * from Item where attribute=#{attribute}" 
public List<Item> getItemList(@Param("attribute") String attribute); 

另一個查詢來獲取所有的鍵 - 值對給定id

如何有一個單一的查詢,這給定的屬性,獲取ID的列表,並填充嵌套對象(數據圖)

//已通過@Results,@Result走了..

回答

8

這種情況也出現在MyBatis的解決方法有兩種:

  • 嵌套選擇 - 您檢索項目列表,併爲每個選項運行單獨的選擇以獲取數據;
  • 嵌套結果 - 通過運行單個連接查詢來檢索包含關聯數據的項目,並讓myBatis處理結果中的重複子集;

第一個選項對性能非常不利,導致所謂的「n + 1選擇問題」。第二個是做這種事情的首選方式。

MyBatis User guide包含一個使用嵌套結果的示例,但它用於XML配置。 Java註釋有一些限制,但理論上應該可以做到這一點(我從來沒有嘗試過ID,因爲我不喜歡在Java代碼中選擇我的選擇,但下面的文章提供了一些有用的信息:IBatis (MyBatis): Handling Joins: Advanced Result Mapping, Association, Collections, N+1 Select Problem)。

+0

最後的註釋示例是嵌套的選擇...似乎沒有辦法使用註釋實現嵌套結果? – 2017-11-29 01:58:19