2011-12-20 3 views
2

I имеют следующую структуру:Java JDBC доступ к нескольким результирующих

Список -> List_Participant -> Участник

поэтому список может содержать несколько participants.I попытаться прочитать это в 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(); 

Но это не работает. Я не получаю исключение и никакой другой выход. Я предлагаю открыть второй набор результатов, который закроет первый, потому что, поскольку я делаю первый набор результатов, сохраняю данные в arraylist и закрываю его, а затем второй, он будет работать, но это приводит к низкой производительности, потому что я должен всегда искать в арраист.

Что может быть лучшим решением?

Edit: Решение это сделать Join, мой текущий попробовать:

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

Как адресовать столбцы сейчас, так как они могут иметь такое же имя?

+4

Любая причина, по которой вы не присоединяетесь к базе данных? Похоже на очевидное решение. –

+1

Вы должны делегировать задание как можно больше на язык SQL, чтобы он возвращал ** точно ** результат, который вы хотите получить только в одном запросе SQL. Это беспроигрышная игра для Java и БД. Изучите предложение 'JOIN'. – BalusC

+0

@JonSkeet: действительно. Я просто не привык к SQL. Как я могу сделать два Соединения сразу? Так что я получаю всех участников во всех списках. Я обновил ответ с моим статус-кво. Джон, пожалуйста, напишите свой комментарий в качестве ответа, поэтому я могу отметить его! – Anthea

ответ

8

Вы можете использовать два разных Statement экземпляров для каждого запроса. См. JavaDoc для java.sql.Statement. Следующий пример показывает принцип.

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).

Лучше всего использовать JOIN согрешите свое единственное утверждение. Это может быть оптимизирована БД:

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

Добавьте любые фильтры/условия, которые Вы хотите минимизировать данные, извлекаемые.

+0

Это правильный ответ. Вы должны расширить его немного больше с помощью некоторого примера кода и/или ссылки или двух. Вот, например, хорошая ссылка: http://docs.oracle.com/javase/6/docs/api/java/sql/Statement.html – Gray

+0

Как указано в @Gray, заявление API Java 6 допускает это как: 'Поэтому, если чтение одного объекта ResultSet чередуется с чтением другого, каждый из них должен быть сгенерирован разными объектами Statement. – ATorras

0

Вложенный запрос? Что-то вроде Select * from List_Participant where name in (select name from List); Это может быть сделано для работы с третьим третьим столбцом.

Смежные вопросы