我有这两个表: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
,但是当我尝试从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'
请问这里出了什么问题?
结果集中的列不以表别名为前缀。
更换:
int businessId = rs.getInt("product_categories.businessId");
附:
int businessId = rs.getInt("businessId");
注意:使用SELECT *
通常不是一个很好的做法;最好明确列出您希望查询返回的列。这使得查询的缩进更清晰,并且当在查询中发挥作用的不同表中存在相同的列名时,可以帮助避免名称冲突。
这可能是由于结果集中列的键名称不同。尝试在数据库中执行查询,然后从那里复制粘贴列名称。
它可能应该是BUSINESSID
或businessid
。
当您连接具有相同列名的多个表时,最好使用alias
作为列名。