德比数据库 - java.sql.SQLException: 找不到列 '表.列名'

4
我有这两个表: inventoryproduct_categories,两个表都有一个名为 businessId 的共同列。
现在我有两个数据库,一个托管在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: Column 'product_categories.businessId' not found

请问这里出了什么问题?

只需:int businessId = rs.getInt("businessId") - GMB
2个回答

6

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

请改为:

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

使用:

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

注意:通常不建议使用SELECT *,最好明确列出要查询返回的列。这可以使查询的缩进更清晰,并且可以帮助避免在查询中涉及的不同表中存在相同列名时产生名称冲突。


1
这可能是由于结果集中列键名称的差异导致的。请尝试在数据库中执行查询,然后从那里复制并粘贴列名。
它可能是BUSINESSIDbusinessid
当您连接具有相同列名的多个表时,最好为列名使用别名。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接