2010-01-13 68 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个查询)。

相关问题