从多个表中检索对象数据有帮助

时间:2011-09-22 19:52:29

标签: sql database orm ibatis

对不起,如果我的措辞不太好,那就让我试着解释一下我在做什么。我有一个A类主要对象,它有多个B,C,D和E类对象。

这样:

Class ObjectA
{
     ObjectB[] myObjectBs;
     ObjectC[] myObjectCs;
     ObjectD[] myObjectDs;
     ObjectE[] myObjectEs;
 }

其中A --- B映射是1到多,B,C,D和E.也就是说,所有B,C,D,E对象只与一个对象A相关联。

我将所有这些对象的数据存储在数据库中,表A包含A类实例的所有数据,等等。

现在,在运行时获取此数据时,我正在为每个对象运行5个不同的查询。

(非常简化的伪代码)

objectA=sql("select * from tableA where id=#id#");
objectA.setObjectBs(sql("select * from tableB where a_id=#id#");
objectA.setObjectCs(sql("select * from tableC where a_id=#id#");
objectA.setObjectDs(sql("select * from tableD where a_id=#id#");
objectA.setObjectEs(sql("select * from tableE where a_id=#id#");

如果这是有道理的。

现在,我想知道,这是最有效的方式吗?我觉得应该有一种方法可以在1个查询中获取所有这些信息,但是做一些事情,比如“从a,b,c,d,e中选择*,其中a.id =#id#和b.a_id = #id#和c.a_id =#id#和d.a_id =#id#和e.a_id =#id#“将给出一个结果集,其中包含每行的A,B,C,D,E的所有列,并且将是我需要的许多行。

如果只有一个对象数组(比如ObjectBs),可以通过简单连接完成,然后由我的数据库框架处理。如果关系是A(一)...... B(很多)和B(一)...... C(很多)它可以用两个连接和工作完成。但是对于A(一个)...... B(很多)和A(一个)...... C(很多)等我想不出一个好的方法来做连接或返回这些数据而没有太多的行,如果A有10个B和10C,那么它将返回100行而不是20行。

那么,我现在正在这样做,有5种不同的选择,效率最高(看起来不是这样),还是有更好的方法呢?

另外,如果我要同时抓取大量的这些(比如5000个ObjectAs以及所有相关的Bs,Cs,Ds和Es),那么有没有办法在没有连续运行的情况下进行一个接一个地查询?

2 个答案:

答案 0 :(得分:0)

您可以使用N + 1选择列表尝试iBatis

http://ibatis.apache.org/docs/dotnet/datamapper/ch03s05.html

H个。

答案 1 :(得分:0)

N + 1选择存在巨大的性能问题(检查https://github.com/balak1986/prime-cache-support-in-ibatis2/blob/master/README)。因此,除非没有其他方法可以实现,否则请不要使用它。

幸运的是,iBatis具有groupBy属性,该属性完全是为了映射这些复杂对象的数据而创建的。 查看http://www.cforcoding.com/2009/06/ibatis-tutorial-aggregation-with.html

中的示例