0

这是我的查询

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(未知来源)

4

1 回答 1

0

此问题已解决,我们使用内存中的 derby 数据库(在开发和测试环境中)来存根数据,并且报告为不属于选择的少数列在内存数据库表中不存在。内存数据库中也不存在报告为“不是表/视图”的表。

我们的应用程序非常大,很难弄清楚这一点。现在我已经添加了在内存数据库中填充 derby 的列/表作为启动脚本的一部分。

我也避免使用 Greatest() 函数,因为它与 derby 不兼容,最终运行良好的查询是

    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(
             SELECT MAX(maxquery.cutoff) 
            FROM 
              (SELECT CNTRY.XPRESCUTOF_SHAW AS cutoff 
               FROM T_XPR_CNTRY_GRP CNTRY 
               UNION  
               SELECT CNTRY.XPRESCUTOF_NONSHAW AS cutoff 
               FROM T_XPR_CNTRY_GRP CNTRY 
               UNION  
               SELECT DEPOT.XPRESCUTOF_SHAW AS cutoff 
               FROM T_XPR_DEPOT_GRP DEPOT 
               UNION  
               SELECT DEPOT.XPRESCUTOF_NONSHAW AS cutoff 
               FROM T_XPR_DEPOT_GRP DEPOT                  
               ) maxquery 
              ) 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

对不起,如果我让你花很多时间来解决这个问题。

于 2013-09-30T11:45:11.747 回答