这是我的查询
SELECT DEFAULT2.DAY_NO AS DAY ,
DEFAULT2.WHSE_WKNG_DAY_IND AS WAREHOUSEWORKINGDAY ,
VALUE(CASE WHEN (DEFAULT2.DEFAULT_CUTOFF_IND='Y') THEN DEFAULT2.XPRES_CUTOFF_TIME ELSE
(SELECT DISTINCT(GREATEST(CNTRY.XPRESCUTOF_SHAW,CNTRY.XPRESCUTOF_NONSHAW,DEPOT.XPRESCUTOF_SHAW,DEPOT.XPRESCUTOF_NONSHAW))
FROM T_XPR_CNTRY_GRP CNTRY ,T_XPR_DEPOT_GRP DEPOT) END ,DEF2.XPRES_CUTOFF_TIME) AS EXPRESSCUTOFFTIME
FROM T_WHSEXPRESCUTOF DEFAULT2
INNER JOIN T_WHSEXPRESCUTOF DEF2 ON DEFAULT2.DAY_NO = DEF2.DAY_NO
ORDER BY DEFAULT2.DAY_NO WITH UR
当我通过 ibatis 3(带注释)运行它时,我的数据库是 db2 我收到错误
java.sql.SQLSyntaxErrorException:列 'DEFAULT2.DEFAULT_CUTOFF_IND' 不在 FROM 列表中的任何表中,或者出现在连接规范中并且超出连接规范的范围,或者出现在 HAVING 子句中并且不在 GROUP BY 中列表。如果这是 CREATE 或 ALTER TABLE 语句,则“DEFAULT2.DEFAULT_CUTOFF_IND”不是目标表中的列。org.apache.ibatis.exceptions.IbatisException: .....
相同的查询通过 squirrel 等 sql 客户端运行良好。我检查了没有访问权限问题。.
这是 Ibatis 中的错误吗?我已经在 mybatis3 问题上发布了相同的内容。
ibatis代码如下
@Select(value = {
"SELECT "+
"DEFAULT2.DAY_NO AS DAY "+
",DEFAULT2.WHSE_WKNG_DAY_IND AS WAREHOUSEWORKINGDAY"+
",VALUE( "+
"CASE "+
"WHEN (DEFAULT2.DEFAULT_CUTOFF_IND='Y') THEN "+
" DEFAULT2.XPRES_CUTOFF_TIME "+
"ELSE "+
" (SELECT DISTINCT(GREATEST(CNTRY.XPRESCUTOF_SHAW" +
",CNTRY.XPRESCUTOF_NONSHAW"+
",DEPOT.XPRESCUTOF_SHAW"+
",DEPOT.XPRESCUTOF_NONSHAW)) "+
" FROM T_XPR_CNTRY_GRP CNTRY "+
" ,T_XPR_DEPOT_GRP DEPOT) "+
"END "+
",DEF2.XPRES_CUTOFF_TIME) AS EXPRESSCUTOFFTIME "+
"FROM T_WHSEXPRESCUTOF DEFAULT2 "+
"INNER JOIN T_WHSEXPRESCUTOF DEF2 "+
"ON DEFAULT2.DAY_NO = DEF2.DAY_NO "+
"ORDER BY DEFAULT2.DAY_NO "+
"WITH UR"
})
@Results({
@Result(property="warehouseWorkingDay", jdbcType=JdbcType.CHAR,typeHandler=YesNoBooleanTypeHandler.class, column="WAREHOUSEWORKINGDAY"),
@Result(property="day", jdbcType=JdbcType.INTEGER,typeHandler= IntegerTypeHandler.class, column="DAY"),
@Result(property="expressCutOffTime", jdbcType=JdbcType.DATE,typeHandler=DateTypeHandler.class, column="EXPRESSCUTOFFTIME")
})
List<CutOffTimeImpl> getCutOffTimes();
问题
- 在执行上述查询时,我得到异常原因:java.sql.SQLSyntaxErrorException:列'DEFAULT2.DEFAULT_CUTOFF_IND'不在 FROM 列表中的任何表中或出现在连接规范中,并且超出连接规范的范围或出现在 HAVING 子句中并且不在 GROUP BY 列表中。如果这是 CREATE 或 ALTER TABLE 语句,则“DEFAULT2.DEFAULT_CUTOFF_IND”不是目标表中的列。org.apache.ibatis.exceptions.IbatisException:
- 我只是将 case 表达式更改为 1=1 以查看它是否是唯一的问题,但进一步向下报告“T_XPR_CNTRY_GRP”不是表/视图
- 我最初的疑问是这是否是访问权限问题,但 DBA 已确认不存在此类约束/限制
- 我最后的疑问是 iBATIS 是否期望作为 select 一部分的每一列都映射到结果列,这会很奇怪。在这种情况下,我们不能这样做,因为 Value(相当于 oracle 中的 nvl 语句)和 case 语句的最终输出被提取为 EXPRESSCUTOFFTIME 并且这被映射到结果集对象字段。我有这个疑问,因为当我替换表达式 DEFAULT2.DEFAULT_CUTOFF_IND ='Y' 与 DAY DEFAULT2.DAY='Y' 在试验的基础上,这个错误(上面的第 2 点)消失了。
更详细的日志
java.sql.SQLSyntaxErrorException:列 'DEFAULT2.DEFAULT_CUTOFF_IND' 不在 FROM 列表中的任何表中,或者出现在连接规范中并且超出连接规范的范围,或者出现在 HAVING 子句中并且不在 GROUP BY 中列表。如果这是 CREATE 或 ALTER TABLE 语句,则“DEFAULT2.DEFAULT_CUTOFF_IND”不是目标表中的列。
在 org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source) 在 org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source) 在 org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException (未知来源) org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(未知来源) org.apache.derby.impl.jdbc.EmbedConnection.handleException(未知来源) org.apache.derby.impl.jdbc .ConnectionChild.handleException(未知来源)