代码之家  ›  专栏  ›  技术社区  ›  Jonas

使用JDBC从多个表中进行选择时,如何标识列?

  •  8
  • Jonas  · 技术社区  · 15 年前

    我在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.
    

    如何使用JDBC和JavaDB/Derby作为数据库从上面的SQL查询中获取值?

    id users posts 检索值时使用 ResultSet

    5 回复  |  直到 15 年前
        1
  •  10
  •   OMG Ponies    15 年前

    你在试图找回 id 值,但您正在使用“posts.id”引用它。 不要

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

    如果您的列名本身是“posts.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
  •  2
  •   Syd    15 年前

    解决方案一:使用别名

    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
    

    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
    
        3
  •  0
  •   blissapp    15 年前

    列名的别名

    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
    
        4
  •  0
  •   raizdepi    9 年前

    如何使用JDBC和JavaDB/Derby作为数据库从上面的SQL查询中获取值?

    ResultSet 的列名。中使用的列名 将是原始列名或别名。

    如果你的 结果集 具有具有相同名称或别名的列 getInt() 将返回第一场比赛。

    用你的选择。。。

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

    …那个 rs.getInt() 将只返回 posts.id 因为它将是第一列。

    使用ResultSet检索值时,如何区分users和posts表中的id列?

    可以为每一列使用唯一的别名,也可以使用 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: 使用 结果元数据

    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;
        }
      }
    }
    
        5
  •  -2
  •   svg    12 年前

    通过按列索引获取数据而不是按列名获取数据,可以进一步简化这些操作。。!!我们从数据库中检索到的任何数据都按照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);
    }
    

    这些将帮助您消除由于数据库表中类似的列名而产生的复杂性和混乱。。

    希望这些有帮助。。。

    祝你一切顺利。。!!