Как я могу определить столбцы при выборе из нескольких таблиц с JDBC? - PullRequest
8 голосов
/ 04 июня 2010

У меня есть две таблицы, к которым я присоединяюсь в столбце 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?

Ответы [ 5 ]

10 голосов
/ 04 июня 2010

Вы пытаетесь получить значение 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");
  ...
}
2 голосов
/ 04 июня 2010

Решение 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
0 голосов
/ 30 октября 2015

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

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

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

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

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

... 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 * +1039 *

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;
    }
  }
}
0 голосов
/ 16 марта 2013

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

например:

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

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

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

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

0 голосов
/ 04 июня 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
...