Как определить столбцы при выборе из нескольких таблиц с помощью 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 в качестве базы данных?

как я могу отличить между на users и posts таблица при получении значений с помощью ResultSet?

5 ответов


вы пытаетесь получить id значение, но вы используете " сообщения.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");
  ...
}

Решение 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: Удалите дубликата пользователя.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

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

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

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

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

если ResultSet имеет столбцы с тем же именем или псевдонимом,getInt() вернет первый матч.

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

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

...the rs.getInt() вернутся только posts.id так как это первая колонка.

как я могу различать столбец id в таблице users и posts при получении значений с помощью 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

Java

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

Java

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;
    }
  }
}

вы можете упростить их, получив данные в соответствии с индексом столбца, а не по имени столбца..!! какие-либо данные из БД сохраняется в результирующем наборе в порядок столбцов в инструкции 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);
}

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

надеюсь, что это помогает...

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