2

我正在尝试将一些新功能添加到使用 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.

}

我在网络应用程序中使用它。在第一页上,我想返回一个“A”列表,然后将链接放在 B 旁边。

例如:

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

等等

(注意:记录 A4 没有指向任何 B 的链接——因此是上面提到的外部连接)

在“A's”的初始获取中,我只想知道 B 记录存在,它的主键是提供到 B 详细记录的链接。所以我的问题是,如何在不在“A”对象上创建完整填充的“B”列表的情况下做到这一点?

4

1 回答 1

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

在这个阶段,标签的groupBy属性可以方便地将结果转换为包含以下内容的对象列表:resultMapC

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

这对于避免 N+1 查询也非常有用。当您返回带有 B 列表的 A 对象时,您可能已经这样做了,但是如果您使用单独的查询来检索列表(即标签select上的属性result),那么我建议您查看“避免 N+1 选择” iBatis Data Mapper 开发人员指南中的部分,以尽量减少返回数据所需的查询数量。

底线是...

...如果您处理大量数据,那么返回满载对象只是为了显示少量信息,可能是矫枉过正。

..另一方面,如果您处理少量数据,则引入另一个处理 ID 的类可能会使事情复杂化,因此您不妨返回 A 和 B 的完整对象(但避免 N+1 查询课程)。

于 2010-01-18T16:25:15.007 回答