iBatis带有临时表的columnName无效

时间:2012-12-13 21:05:19

标签: sql-server ibatis

当我尝试从应用程序运行SQL映射时,我收到的列名无效。基本上我有两个单独的映射文件,基本上做同样的事情,除了创建一个具有不同名称的列。请注意,我已故意离开DROP TABLE来说明此问题。我知道这是一个不好的做法但我正在寻找为什么会发生这种情况。我们已经通过在每个SQL映射中显式删除表来纠正此行为。

查询1:

<select id="Query1"   parameterClass="query1Criteria">   

    IF Object_Id('tempdb..##severity') IS NOT NULL     
    BEGIN
      DROP TABLE ##severity
    END     

    CREATE TABLE ##severity( valueCode VARCHAR(255) NOT NULL, displayOrder INT NOT NULL)
    INSERT INTO ##severity
        SELECT DISTINCT valueCode,MAX(displayOrder) FROM DataDictionaryValue
        WHERE zoneID = #zoneID# AND categoryCode = 'SEVERITY'
        GROUP BY valueCode 

    SELECT valueCode FROM ##severity

</select>

查询2:

<select id="Query2" parameterClass="query2Criteria">   

    IF Object_Id('tempdb..##severity') IS NOT NULL     
    BEGIN
      DROP TABLE ##severity
    END     

    CREATE TABLE ##severity( severityCode VARCHAR(255) NOT NULL, displayOrder INT NOT NULL)
    INSERT INTO ##severity
        SELECT DISTINCT valueCode,MAX(displayOrder) FROM DataDictionaryValue
        WHERE zoneID = #zoneID# AND categoryCode = 'SEVERITY'
        GROUP BY valueCode 

    SELECT severityCode FROM ##severity

</select>

从应用程序中,我运行Query1。执行得很好,我看到在SQL Management Studio中创建的临时表。然后我执行Query2,并得到以下堆栈跟踪:

org.springframework.jdbc.BadSqlGrammarException: SqlMapClient operation; bad SQL grammar []; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:   
--- The error occurred in com/test/model/safety/reports/Query2Map.xml.  
--- The error occurred while applying a parameter map.  
--- Check the Query2.getResults-InlineParameterMap.  
--- Check the statement (query failed).  
--- Cause: java.sql.SQLException: Invalid column name 'severityCode'.
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.translate(SQLErrorCodeSQLExceptionTranslator.java:276)
    at org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:212)
    at org.springframework.orm.ibatis.SqlMapClientTemplate.executeWithListResult(SqlMapClientTemplate.java:249)
    at org.springframework.orm.ibatis.SqlMapClientTemplate.queryForList(SqlMapClientTemplate.java:296)
    at com.test.model.BaseSqlMapDao.executeQueryForList(BaseSqlMapDao.java:53)
    at com.test.model.safety.reports.Query2SqlMapDao.getOpenIssues(Query2SqlMapDao.java:124)
    at com.test.model.safety.reports.Query2SqlMapDao.getResults(Query2SqlMapDao.java:50)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

如果我在SMS中运行Query2的SQL,它将正确执行。事实上,这两个查询都将在SMS中正确执行。我不明白iBatis是如何工作的,但是看起来iBatis看到了在Query1中创建的临时表,并且针对该模式验证了Query2的语法,在这种情况下抛出了无效的列名异常。但是,这意味着iBatis会保留对临时表的引用,这与临时表作用于连接的SQL服务器范例相矛盾。

有人能解释这里发生了什么吗?

2 个答案:

答案 0 :(得分:0)

也许您可以使用表变量而不是临时表。

看起来像是:

DECLARE @severity as TABLE ( valueCode VARCHAR(255) NOT NULL, displayOrder INT NOT NULL)

INSERT INTO @severity
    SELECT DISTINCT valueCode,MAX(displayOrder) FROM DataDictionaryValue
    WHERE zoneID = #zoneID# AND categoryCode = 'SEVERITY'
    GROUP BY valueCode 

SELECT valueCode FROM @severity

您也可以删除DISTINCT个关键字。 GROUP BY valueCode已经确保了不同的valueCode值。

答案 1 :(得分:0)

由于您要插入数据的表的列名与您从中获取数据的表不匹配,因此抛出错误。

 CREATE TABLE ##severity( severityCode VARCHAR(255) NOT NULL, displayOrder INT NOT NULL)
INSERT INTO ##severity
    SELECT DISTINCT valueCode,MAX(displayOrder) FROM DataDictionaryValue
    WHERE zoneID = #zoneID# AND categoryCode = 'SEVERITY'
    GROUP BY valueCode 

SELECT severityCode FROM ##severity    

在上面的代码片段中,您在内部查询中选择valueCode并将其插入到##严重性临时表中,该表没有valueCode列名。