首页 > 解决方案 > Derby - java.sql.SQLException:找不到列'table.column_name'

问题描述

我有这 2 个表:inventory并且product_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时 Derby 抛出异常businessIdproduct_categories

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”

请问这里出了什么问题?

标签: javamysqlsqlinner-joinderby

解决方案


结果集中的列不以表别名为前缀。

代替:

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

和:

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

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


推荐阅读