java jdbc访问多个结果集

c8ib6hqw  于 2023-05-15  发布在  Java
关注(0)|答案(3)|浏览(193)

我有以下结构:
列表-->列表_参与者-->参与者
所以一个列表可能包含多个参与者。我试着用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();

但这不起作用。我没有收到异常或任何其他输出。我建议打开第二个结果集将关闭第一个结果集,因为我做了第一个结果集,将数据存储在数组列表中并关闭它,然后第二个结果集就可以工作了,但这会导致性能不佳,因为我必须总是在数组列表中搜索。
什么可能是更好的解决方案?
编辑:解决方案是做一个加入,我目前的尝试:

select * from List_participant 
INNER JOIN List ON List.name = List_participant.List 
INNER JOIN participant ON List_participant.participant =participant.ROWID;

既然列可能具有相同的名称,那么现在如何对列进行寻址?

pgvzfuti

pgvzfuti1#

您可以尝试为每个查询使用 * 两个 * 不同的Statement示例。参见java.sql.Statement的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的标准用法。它剥夺了数据库的任何优化可能性,并在DB和应用程序之间移动了大量数据(参见JohnSkeet和BalusC的评论)。

最好在您的唯一语句中使用适当的JOIN。这 * 可以 * 由DB优化:

SELECT lp.* FROM list l JOIN List_Participant lp ON l.name = lp.name

添加您喜欢的任何过滤器/条件,以最小化检索的数据。

svujldwt

svujldwt2#

以下是不能从同一个Statement打开两个ResultSet的原因
ResultSet javadoc
当生成ResultSet对象的Statement对象被关闭、重新执行或用于从多个结果的序列中检索下一个结果时,ResultSet对象将自动关闭
所以基本上,一个Statement一次只能给予你一个ResultSet,所以当你执行第二个查询时,你会丢失第一个结果。
解决方案:

  • 每个ResultSet需要使用一个Statement示例。
  • 合并查询以只有一个
fnvucqvd

fnvucqvd3#

嵌套查询?类似于Select * from List_Participant where name in (select name from List);的东西也可以用于第三个表。

相关问题