执行查询时 ibatis 3(DB2 数据库)中出现错误.它从SQL客户端运行良好



这是我的查询

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: Column 'DEFAULT2.DEFAULT_CUTOFF_IND' 要么不在 FROM 列表中的任何表中,要么出现在连接规范中,并且超出了连接规范的范围,或者出现在 HAVING 子句中,但不在 GROUP BY 列表中。如果这是一个 CREATE 或 ALTER TABLE 语句,则 'DEFAULT2。DEFAULT_CUTOFF_IND' 不是目标表中的列。org.apache.ibatis.exceptions.IbatisException: .....

相同的查询在 sql 客户端(如松鼠(中运行良好。我已经检查过没有访问权限问题。.

这是伊巴蒂斯的错误吗?我已经在mybatis3问题上发布了相同的内容。

伊巴蒂斯代码如下

@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: Column"DEFAULT2。DEFAULT_CUTOFF_IND' 不在 FROM 中的任何表中列出或出现在联接规范中且超出范围的连接规范或出现在 HAVING 子句中且不在分组依据列表。如果这是一个 CREATE 或 ALTER TABLE 语句,则"DEFAULT2。DEFAULT_CUTOFF_IND' 不是目标表中的列。 org.apache.ibatis.exceptions.IbatisException:
  • 我只是将 case 表达式更改为 1=1,看看它是否是唯一的问题,但再往下,它报告说"T_XPR_CNTRY_GRP"不是表/视图
  • 我最初的怀疑是这是否是一个访问权限问题,但 DBA 有确认不存在此类约束/限制
  • 我最后一个疑问是,iBATIS是否期待每一列都是选择要映射到结果列的选择,这会很奇怪。在这种情况下,我们不能这样做,因为最终输出值(相当于预言机中的 nvl 语句(和 case 语句为作为 EXPRESSCUTOFFTIME 获取,并将其映射到结果集对象字段。我有这个疑问,因为当我替换表达式时DEFAULT2。DEFAULT_CUTOFF_IND ='Y' 与 DAY DEFAULT2。每天="Y"试验基础 这个错误(上面的第 2 点(去。

更详细的日志

java.sql.SQLSyntaxErrorException: Column 'DEFAULT2.DEFAULT_CUTOFF_IND' 要么不在 FROM 列表中的任何表中,要么出现在连接规范中,并且超出了连接规范的范围,或者出现在 HAVING 子句中,但不在 GROUP BY 列表中。如果这是一个 CREATE 或 ALTER TABLE 语句,则 'DEFAULT2。DEFAULT_CUTOFF_IND' 不是目标表中的列。

at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source( at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source( at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source( at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source( at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source( at org.apache.derby.impl.jdbc.ConnectionChild.handleException(未知来源(

此问题已解决,我们在内存 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

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

相关内容

最新更新