Derby - java.sql.SQLException:找不到列'table.column_name'

问题描述 投票:4回答: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,但是当我尝试从businessId表中获取product_categories列时,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'

请问这里出了什么问题?

java mysql sql derby
2个回答
5
投票

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

更换:

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

附:

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

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


1
投票

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

它可能应该是BUSINESSIDbusinessid

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

© www.soinside.com 2019 - 2024. All rights reserved.