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