Как я могу идентифицировать столбцы при ВЫБОРЕ из нескольких таблиц с помощью JDBC?

У меня есть две таблицы, к которым я присоединяюсь к столбцу id, они выглядят так:

+-------+
| users |
+----+--+---+
| id | name |
+----+------+

+-------+
| posts |
+-------+------+---------+
| id | user_id | message |
+----+---------+---------+

И теперь я хочу выбрать все сообщения и указать имя пользователя с помощью:

SELECT * FROM posts, users WHERE user_id = users.id

И затем я пытаюсь получить значения с помощью:

ResultSet rs = // SQL
if(rs.next()) {
    rs.getInt("posts.id");
    ...
}

Но я получаю SQLException при выполнении rs.getInt("posts.id") :

java.sql.SQLException: Column 'posts.id' not found.

Как я могу получить значения из приведенного выше SQL-запроса, используя JDBC и JavaDB/Derby в качестве базы данных?

Как различить столбец id в таблице users и posts при извлечении значений с помощью ResultSet?


person Jonas    schedule 03.06.2010    source источник


Ответы (5)


Вы пытаетесь получить значение id, но используете «posts.id» для ссылки на него. Нет

Все, что вам нужно, это имя столбца или псевдоним, а не имя таблицы:

ResultSet rs = // SQL
if(rs.next()) {
  rs.getInt("id");
  ...
}

Это сработало бы, если бы имя вашего столбца было «posts.id», но я рекомендую использовать подчеркивание (_) вместо точки, если вы решите обновить таблицу.

Но у меня есть столбец id в обеих таблицах, как их различить?


Вам нужно указать псевдоним столбца:

SELECT p.id AS post_id,
       p.name,
       u.id AS users_id, 
       p.user_id, --redundant due to relationship, omit if possible
       u.message
  FROM POSTS p
  JOIN USERS u ON u.id = p.user_id

... и ссылайтесь на этот псевдоним столбца в коде Java:

ResultSet rs = // SQL
if(rs.next()) {
  rs.getInt("post_id");
  ...
}
person OMG Ponies    schedule 03.06.2010
comment
Но у меня есть столбец id в обеих таблицах, как мне различить их, если я использую только rs.getInt("id") вместо rs.getInt("posts.id") и rs.getInt("users.id")? - person Jonas; 04.06.2010
comment
Я смог без проблем использовать синтаксис имени столбца имени таблицы. - person slim; 10.11.2014

Решение 1: использовать псевдоним

select u.id as uid, u.name, p.id as post_id, p.user_id, p.message from
users u inner join posts p on u.id=p.user_id

Решение 2: удалите дубликат user.id, так как он уже есть в таблице сообщений.

select p.user_id, u.name, p.id as post_id, p.message from
users u inner join posts p on u.id=p.user_id
person Syd    schedule 03.06.2010

Псевдонимы имен столбцов

SELECT
    posts.id posts_id,
    name name,
    id id,
    user_id,
    message
FROM posts 
INNER JOIN users 
    ON posts.user_id = users.id

в зависимости от вашего вкуса sql, этот псевдоним может потребоваться

posts.id as posts_id
person blissapp    schedule 03.06.2010

Как я могу получить значения из приведенного выше SQL-запроса, используя JDBC и JavaDB/Derby в качестве базы данных?

Чтобы получить значения, вы должны использовать имя столбца ResultSet. Имя столбца, используемое в ResultSet, будет исходным именем столбца или псевдонимом.

Если в вашем ResultSet есть столбцы с таким же именем или псевдонимом, getInt() вернет первое совпадение.

С вашим выбором...

SELECT * FROM posts, users WHERE user_id = users.id

... rs.getInt() вернет только posts.id, так как это будет первый столбец.

Как я могу различать столбец id в таблице пользователей и сообщений при получении значений с помощью ResultSet?

Вы можете использовать уникальный псевдоним для каждого столбца или использовать ResultSetMetaData


  • Решение 1. Используйте псевдоним SQL

SQL

SELECT p.id AS post_id,
    p.name AS post_name,
    u.id AS user_id, 
    u.message AS user_message
  FROM POSTS p
  JOIN USERS u
    ON u.id = p.user_id

Ява

ResultSet rs = // SQL
if(rs.next()) {
  rs.getInt("post_id");
  rs.getInt("user_id");
}

  • Решение 2. Используйте ResultSetMetaData

SQL

SELECT p.id
    p.name
    u.id
    u.message
  FROM POSTS p
  JOIN USERS u
    ON u.id = p.user_id

Ява

Integer userID;
Integer postID;

ResultSetMetaData rsMeta = rs.getMetaData();
if (rs.next()) {
  for (int i = 1; i <= rsMeta.getColumnCount(); i++) {
    String table = rsMeta.getTableName(i);
    String col = rsMeta.getColumnName(i);

    if(table.equals("users") && col.equals("id")){
      userID = rs.getInt(i);
      continue;
    }

    if(table.equals("posts") && col.equals("id")) {
      userID = rs.getInt(i);
      continue;
    }
  }
}
person raizdepi    schedule 30.10.2015

вы можете еще больше упростить их, получая данные в соответствии с индексом столбца, а не по имени столбца..!! какие бы данные мы ни извлекали из БД, они хранятся в наборе результатов в порядке столбцов в соответствии с оператором select, поэтому вместо получения данных в соответствии с именем столбца предпочтительнее извлекать данные в соответствии с индексом столбца в наборе результатов.

ex:

String query = " select age,num from table_abc";
ResultSet rs= statement.executeQuery(query);

while(rs.next){
   int var1= rs.getInt(1);
   int var2= rs.getInt(2);
}

это поможет вам избавиться от сложности и путаницы, возникающих из-за одинаковых имен столбцов в таблицах базы данных.

Надеюсь, это поможет...

Всего наилучшего..!!

person svg    schedule 16.03.2013