【问题标题】:Derby - java.sql.SQLException: Column 'table.column_name' not foundDerby - java.sql.SQLException:未找到列“table.column_name”
【发布时间】:2019-08-22 10:23:24
【问题描述】:

我有这 2 个表:inventoryproduct_categories 两个表都有一个名为 businessId 的公共列。

现在我有 2 个数据库,一个托管在 MySQL 上,另一个托管在 Derby 上,这两个数据库具有相同的表结构。

所以我一直在两个数据库上执行以下查询:

SELECT * 
FROM INVENTORY
INNER JOIN PRODUCT_CATEGORIES
    ON INVENTORY.BUSINESSID = PRODUCT_CATEGORIES.BUSINESSID
    AND INVENTORY.CATEGORY = PRODUCT_CATEGORIES.CATEGORYNAME
WHERE INVENTORY.BUSINESSID = 1

当我使用下面的 Java 代码执行上面的查询时,我在两个数据库中都获得了成功的 ResultSet,但是当我尝试从 product_categories 表中获取 businessId 列时,Derby 抛出异常

try(Connection conn = dbConfig.getDatabaseConnection())
{
    PreparedStatement pst = conn.prepareStatement(sql);
    pst.setInt(1, businessId);
    List<Product> products = new ArrayList<>();
    ResultSet rs = pst.executeQuery();
    while(rs.next())
    {
        ...
        int businessId = rs.getInt("product_categories.businessId"); //<-- This lines throws an exception
        ...
    }
}

我收到此错误消息:

java.sql.SQLException:未找到列“product_categories.businessId”

请问这里出了什么问题?

【问题讨论】:

  • 只是:int businessId = rs.getInt("businessId")

标签: java mysql sql inner-join derby


【解决方案1】:

结果集中的列没有表别名前缀。

替换:

int businessId = rs.getInt("product_categories.businessId");

与:

int businessId = rs.getInt("businessId");

注意:使用SELECT * 通常不是一个很好的做法;最好明确列出您希望查询返回的列。这使得查询的缩进更清晰,并且有助于避免在查询中发挥作用的不同表中存在相同列名时的名称冲突。

【讨论】:

    【解决方案2】:

    这可能是由于结果集中列的键名不同。尝试在数据库中执行查询,然后从那里复制粘贴列名。

    应该是BUSINESSIDbusinessid

    当您连接多个具有相同列名的表时,最好使用alias 作为列名。

    【讨论】:

      猜你喜欢
      • 2021-06-22
      • 2019-11-11
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多