执行查询时ibatis 3(db2数据库)中的错误。它从SQL客户端运行良好

时间:2013-09-26 14:10:19

标签: sql database db2

这是我的查询

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:Column '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会很奇怪。 在这种情况下,我们不能这样做,因为最终的出局 值(相当于oracle中的nvl语句)和case语句是 获取为EXPRESSCUTOFFTIME并将其映射到结果集 对象field.I有这个怀疑,因为当我替换表达式 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'不是目标表中的列。

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

1 个答案:

答案 0 :(得分:0)

这个问题已经解决了,我们在内存derby数据库(在开发和测试环境中)中使用了存根数据,并且在内存数据库表中没有出现报告为不是select的一部分的少数列。报告为“非表/视图”的表也不存在于内存数据库中。

我们是一个非常大的应用程序很难弄清楚这一点。现在我添加了在内存数据库中填充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

很抱歉,如果我让你花了很多时间来解决这个问题。