Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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
java jdbc访问多个结果集_Java_Database_Jdbc - Fatal编程技术网

java jdbc访问多个结果集

java jdbc访问多个结果集,java,database,jdbc,Java,Database,Jdbc,我的结构如下: 列表->列表参与者->参与者 因此,一个列表可能包含多个参与者。我尝试用java阅读以下内容: stat = con.createStatement(); ResultSet rs = stat.executeQuery("select * from list;"); // get the informations about the bracket sheet while (rs.next()) {

我的结构如下:

列表->列表参与者->参与者

因此,一个列表可能包含多个参与者。我尝试用java阅读以下内容:

        stat = con.createStatement();
        ResultSet rs = stat.executeQuery("select * from list;");
        // get the informations about the bracket sheet
        while (rs.next()) {
          string name = rs.getString("Name");
          ResultSet rs2 = stat.executeQuery("select * from List_Participant where name= '"+name+"';"); 

            while (rs2.next()) {
               // get the participants

            }
            rs2.close();
        }
        rs.close();
但这是行不通的。我没有收到异常或任何其他输出。我建议打开第二个resultset将关闭第一个resultset,因为我创建了第一个resultset,将数据存储在arraylist中并关闭它,然后第二个resultset将正常工作,但这会导致性能不佳,因为我必须始终在arraylist中搜索

有什么更好的解决方案

编辑:解决方案是加入,我当前的尝试:

 select * from List_participant 
INNER JOIN List ON List.name = List_participant.List 
INNER JOIN participant ON List_participant.participant =participant.ROWID;
由于列可能具有相同的名称,现在如何寻址这些列?

您可以尝试为每个查询使用两个不同的语句实例。有关详细信息,请参阅JavaDoc。下面的示例显示了该原理

    Statement statement1 = connection.createStatement();
    Statement statement2 = connection.createStatement();

    ResultSet resultSet1 = statement1.executeQuery("select * from list");
    while(resultSet1.next()){
        String name = resultSet1.getString("Name");

        ResultSet resultSet2 = statement2.executeQuery("select * from List_Participant where name= '"+name+"'");
        while(resultSet2.next()){
            // get the participants
        }
    }
但是:这不是JDBC或SQL的标准用法,原因很充分。它剥夺了数据库的任何优化可能性,并在数据库和应用程序之间移动了大量数据,这是没有充分理由的。见JohnSkeet和BalusC的评论

最好在你唯一的陈述中使用适当的连接。这可以通过数据库进行优化:

SELECT lp.* FROM list l JOIN List_Participant lp ON l.name = lp.name
添加任何筛选器/条件以最小化检索到的数据。

嵌套查询? 类似于Select*from List_参与者,其中姓名在Select name from List中;
这也可以用于你的第三个标签

这就是为什么不能从同一条语句中打开两个ResultSet的原因

:

当生成ResultSet对象的语句对象关闭、重新执行或用于从多个结果序列中检索下一个结果时,ResultSet对象将自动关闭

因此,基本上,一条语句一次只能给您一个ResultSet,因此在执行第二个查询时会丢失第一个结果

解决方案:

需要为每个结果集使用一个语句实例。 将查询合并为只有一个查询
你为什么不加入数据库?似乎是显而易见的解决方案。您应该尽可能多地将作业委托给SQL语言,以便它只在一个SQL查询中返回您想要的结果。这对Java和DB来说都是双赢的。学习JOIN子句。@JonSkeet:的确如此。我只是不习惯SQL。我如何同时进行两次连接?这样我就能得到所有列表中的所有参与者。我用我的现状更新了答案。乔恩,请写下你的评论作为答案,这样我就可以标记它了@安西娅:不妨同意A.H.的答案:这是正确的答案。您应该使用一些示例代码和/或一两个链接来进一步扩展它。例如,这里有一个很好的链接:@Gray指出,Java 6 API语句允许它是这样的:因此,如果一个ResultSet对象的读取与另一个ResultSet对象的读取交织在一起,那么每个对象都必须由不同的语句对象生成