2010-01-13 69 views
2

我試圖將一些新功能添加到使用iBatis的現有應用程序中,但我有點卡住了其中一項設計決策。iBatis - 標題詳細信息問題

有一個現有的類(稱爲類A),我想添加一些新的領域。這些字段將是B類型。

查詢將通過外部聯接連接B.

因此,這將是像

public class A { 

    //... existing fields 
    private List<B> bList; // may use a Map rather than a list? 

    // etc. 
} 

public class B { 
    private int id; // primary key 
    private int type; 
    private String description; 

    // etc. 

}

我在Web應用程序中使用此。在第一頁上,我想返回一個「A」列表,然後爲B添加鏈接。

例如:

LinktoRecordA1 - LinktoB1 LinktoB2 LinktoB3 
LinktoRecordA2 - LinktoB1   LinktoB3 
LinktoRecordA3 - LinktoB1 LinktoB2 LinktoB3 
LinktoRecordA4 

(NB:記錄A4沒有鏈接到任何B的 - 因此外連接上述)

在初始獲取的「A的「,我只想知道B記錄是否存在,並且它的主要關鍵是將鏈接展示給B細節記錄。所以我的問題是,如何在沒有在「A」對象上創建完整填充的「B」列表的情況下做到這一點?

+0

從你的例子我知道你需要顯示A的鏈接,除此之外還有B的鏈接。那麼,爲什麼只有在ID字段(A的ID和B的ID)之後才能獲取完整的A? – 2010-01-15 12:22:17

+0

嗨dpb, 我認爲這就是我出錯的地方。我應該怎麼做呢? 我認爲我在解讀代碼時遇到的問題是 - 我應該返回一個只填充了最少數據的「A」對象列表,還是應該創建某種新對象? –

回答

0

關於你的評論:

How else should I do it? I think what I'm having trouble understading is 
this- should I return a list of "A" objects with only minimal data 
populated, or would should I create some kind of new object? 

在像你描述的(當返回一個列表,用戶可以選擇從它的東西),我已經注意到,用戶通常選擇一個或兩個記錄的一個情況看更多的細節。在這種情況下,您最終會返回一個完全填充的對象的列表。

在這種情況下,我所做的是回退選擇對象標識符而不是完整的對象。

所以,你可以創建一個新的類,只有這樣的數據:

public class C { 
    private Integer idForA; 
    private List<Integer> listOfIdsForB = new ArrayList<Integer>(); 
    //... 
} 

然後,您可以用外寫您的查詢加入迴歸A和B的標識符和返回類似這樣的結果:

IDtoRecordA1 | IDtoB1 
IDtoRecordA1 | IDtoB2 
IDtoRecordA1 | IDtoB3 

IDtoRecordA2 | IDtoB1   
IDtoRecordA2 | IDtoB3 
IDtoRecordA3 | IDtoB1 

IDtoRecordA3 | IDtoB2 
IDtoRecordA3 | IDtoB3 

IDtoRecordA4 | null 

在這個階段,resultMap標籤的groupBy屬性派上用場,以變換C對象的列表包含此結果:

C1: IDtoRecordA1, [IDtoB1, IDtoB2, IDtoB3] 
C2: IDtoRecordA2, [IDtoB1, IDtoB3] 
C3: IDtoRecordA3, [IDtoB1, IDtoB2, IDtoB3] 
C4: IDtoRecordA4, [] 

這對避免N + 1查詢也非常有用。當您返回一個包含B列表的對象時,您可能已經這樣做了,但是如果您使用單獨的查詢來檢索列表(即result標記上的select屬性),那麼比我建議您查看「Avoiding N + 1選擇iBatis Data Mapper開發人員指南中的「部分」,以儘量減少返回數據所需的查詢數量。

底線是...

...如果你處理大量的數據,然後返回滿載的對象只是爲了顯示少量的信息,可能是矯枉過正。

..另一方面,如果您處理少量數據,引入處理ID的另一個類可能會使事情複雜化,因此您可能還會返回A和B的完整對象(但當然避免N + 1個查詢)。

相關問題