【发布时间】:2016-01-26 03:02:00
【问题描述】:
我正在使用 HSQLDB 为我的应用程序编写一些功能测试。我的应用生成以下 SQL 请求:
SELECT
CLIENT.account_id,
CLIENT.client_code,
SHIPPINGADDRESS10A9.account_id,
SHIPPINGADDRESS10A9.address_code
FROM CLIENT
LEFT JOIN ADDRESS SHIPPINGADDRESS10A9
ON SHIPPINGADDRESS10A9.address_code = CLIENT.shipping_address_code AND (SHIPPINGADDRESS10A9.account_id = 4)
WHERE CLIENT.account_id = 4
此请求有效并且适用于我的代码(JDBC + MySQL)。当我尝试使用 HSQLDB 执行功能测试时,出现以下异常:
resultSet.findColumn("CLIENT.account_id"); //Works
resultSet.findColumn("SHIPPINGADDRESS10A9.account_id"); //Exception
Caused by: java.sql.SQLException: Column not found: SHIPPINGADDRESS10A9.account_id
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCResultSet.findColumn(Unknown Source)
at com.inventis.bw.data.DataBaseUtil.loadBean(DataBaseUtil.java:419)
... 33 more
Caused by: org.hsqldb.HsqlException: Column not found: SHIPPINGADDRESS10A9.account_id
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.error.Error.error(Unknown Source)
... 36 more
知道我在这里做错了什么吗?
编辑: 看起来问题来自表别名。
logger.debug("address account id => " + resultSet.findColumn("ADDRESS.account_id")); // Works
logger.debug("address account id => " + resultSet.findColumn("SHIPPINGADDRESS10A9.account_id")); //Exception
使用表名访问列值效果很好,但是如果我使用表别名,则会引发异常。有什么想法吗?
感谢您的帮助。
【问题讨论】:
-
您应该接受@Gordon 的回答。从
SQL结果集中进行选择时,不应依赖表(别名)前缀。只需引用(别名)列名 without 前缀。制作唯一的列别名,你就做对了。 -
When selecting from an SQL result set, one should not rely on table (alias) prefixes.为什么?我的代码基于别名完美运行,只有 HSQLDB 失败。 -
例如,来自Oracle documentation:“列的标签用SQL AS子句指定。如果没有指定SQL AS子句,那么标签是列名。"另见问答here。
-
黑暗中的一枪:尝试通过将“LEFT JOIN ADDRESS SHIPPINGADDRESS10A9”更改为“LEFT JOIN ADDRESS AS SHIPPINGADDRESS10A9”来明确使用 AS。
标签: java sql left-join hsqldb functional-testing