Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > вопрос по JDBC


Автор: slolennnn 22.8.2006, 14:15
Подскажите плиз как правильно делать такую обычную вещь.
Надо выбрать данные из таблицы например Users и таблицы Jobs,
которые соединены между собой many-to-many через таблицу
User_Job.
Ну вот делаю запрос
Код



  String query = "SELECT user_id, user_name FROM Users;";
  Connection con = getConnection(url, login, password);
  Statement  st = con.createStatement();
  ResultSet rs = st.executeQuery(query);
  while (rs.next())
  {
    int user_id = rs.getInt(1);
    String name = rs.getString(2);
    //И тут мне надо выбрать по user_id все записи из таблицы User_Job и Jobs!
    //То есть так примерно?
    List jobs = getJobsByUserId(Connection con,int userId);
     //Кстати - а можно передавать List jobs = getJobsByUserId(!!!!Statement  st ,int userId) ?
    
  }
    rs.close();st.close();  con.close()
//И сам метод 
  private List getJobsByUserId(Connection con,int userId)
  { 
      PreparedStatement prepSt= con.prepareStatement(
    "SELECT j.job_name FROM Jobs j, User_Job  uj 
                      WHERE uj.job_id = j.job_id AND   uj.user_id = ?";
      prepSt.setInt(1,userId);
      ResultSet rs = prepSt.executeQuery();
      while(rs.next())
     { 
        create List from ResultSet
     }
     return created List
   }



Получается очень громоздко!
Может есть более элегантный способ именно при помощи чистого JDBC?

Автор: LSD 22.8.2006, 14:21
Цитата(slolennnn @  22.8.2006,  15:15 Найти цитируемый пост)
Может есть более элегантный способ именно при помощи чистого JDBC?

А может при помощи чистого SQL?
Код
select u.user_id, u.user_name, j.job_name from users u
  left join user_jobs uj on uj.user_id = u.user_id
  left join jobs j on j.job_id = uj.job_id

Автор: slolennnn 22.8.2006, 14:33
Цитата

А может при помощи чистого SQL?
Выделить всёкод SQL
 select u.user_id, u.user_name, j.job_name from users u
      left join user_jobs uj on uj.user_id = u.user_id
      left join jobs j on j.job_id = uj.job_id

Ну а как потом выбрать эти данные из ResultSet
Код

  while(resultSet.next()
  {
      int id = resultSet.getInt(1);
      String userName = resultSet.getString(2);
      String  jobName = resultSet.getString(3);
  }

И получиться что из базы приходит десять кортежей типа
 1- Иванов - Программист
 1 - Иванов - Администратор
 1-  Иванов - Культурист
А мне в прнципе это надо чтоб прочитать 1- Иванов,  сделать User user = new User(1, "Иванов"):
 потом по 1  прочитать  и сделать List  listOfJobs.add("Программист","Администратор","Культурист"); 
и наконец  user.setJobs(listOfJobs).

Автор: Bulat 22.8.2006, 14:37
Вообще LSD прав это надо делать через сам запрос, который кстати можно записать и немного иначе, но я не знаю детально архитектуру твоей БД

Автор: LSD 22.8.2006, 14:38
Тогда никак, кроме как руками. 
JDBC не предоставляет никакой функциональности сверх того, что может обеспечить сервер СУБД.

Автор: Bulat 22.8.2006, 14:49
slolennnn, подумай над запросом, я не совсем понял, что тебе и как надо, но если уметь правильно строить запросы, то можно очень легко уменьшать громоздкость кода  smile 

Автор: Skipy 24.8.2006, 14:20
Просто в JDBC такого, похоже не сделать. А почему бы не воспользоваться Hibernate, который умеет и это, и еще два миллиона вещей впридачу?

Автор: Bulat 24.8.2006, 15:02
Skipy, вообще и в JDBC это не сложно делается:

Даже если пришло:
1- Иванов - Программист
1 - Иванов - Администратор
1-  Иванов - Культурист

кидаем 1 в int id_buf, и пока он совпадает со следующим, rs.getInt("id"), в цикле в String job =+ rs.getString("jobs"), можно еще и фамилию подцепить к проверке, а когда приходит следующий id то итоговый job в наш List. Тут полно вещей для творчества, надо только маленько подумать и ничего сложного, ни один код не будет делать все за программиста или пользователя и так уже много делает  smile 

Автор: COVD2 25.8.2006, 00:03
"А почему бы не воспользоваться Hibernate.."

- неужели SQL сложнее?

Автор: Bulat 25.8.2006, 10:14
COVD2, есть такие задачи, которые более связаны с языком нежели с запросом, и поэтому все через SQL не устроишь 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)