Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从多个表检索对象数据帮助_Sql_Database_Orm_Ibatis - Fatal编程技术网

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

Sql 从多个表检索对象数据帮助,sql,database,orm,ibatis,Sql,Database,Orm,Ibatis,对不起,如果我的措辞不太好,但让我试着解释一下我在做什么。我有一个类a的主对象,它有多个类B、C、D和E的对象 以便: Class ObjectA { ObjectB[] myObjectBs; ObjectC[] myObjectCs; ObjectD[] myObjectDs; ObjectE[] myObjectEs; } 其中,对于B、C、D和E,A--B映射为1到多。也就是说,所有B、C、D、E对象仅与一个对象A关联 我将所有这些对象的数据存

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

以便:

Class ObjectA
{
     ObjectB[] myObjectBs;
     ObjectC[] myObjectCs;
     ObjectD[] myObjectDs;
     ObjectE[] myObjectEs;
 }
其中,对于B、C、D和E,A--B映射为1到多。也就是说,所有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#");
如果这有道理的话

现在,我想知道,这是最有效的方法吗?我觉得应该有一种方法可以在一个查询中获得所有这些信息,但是做一些类似于从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列的结果集,而且我还需要更多的行

如果只有一个像ObjectB这样的对象数组,那么可以通过简单的连接完成,然后由我的数据库框架处理。如果关系是一个…B多和一个…C多,它可以通过两个连接和工作来完成。但是对于Aone…Bmany和Aone…Cmany等,我想不出一个好的方法来进行连接或返回此数据,而不需要太多行,因为对于连接,如果a有10个B和10个C,它将返回100行而不是20行

那么,我目前采用的方法,有5种不同的选择,是最有效的方法,但似乎不是,还是有更好的方法


另外,如果我一次抓取一大组对象,比如5000个ObjectAs和所有相关的Bs、Cs、Ds和Es,有没有一种方法可以做到这一点,而不必一个接一个地运行大量连续查询

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


Hth.

N+1选择检查存在巨大的性能问题。所以请不要使用它,除非没有其他方法来实现这一点

幸运的是,iBatis具有groupBy属性,该属性的创建正是为了映射此类复杂对象的数据。 从中检查示例