アプリケーションからSQLマップを実行しようとすると、無効な列名が表示されます。基本的に、2つの別々のマッピングファイルがあります。これらは、異なる名前で列を作成することを除いて、基本的に同じことを行います。この問題を説明するために、わざとDROPTABLEを省略していることに注意してください。これが悪い習慣であることは知っていますが、なぜこれが起こるのかを探しています。その後、すべての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を実行します。正常に実行され、SQLManagementStudioで作成された一時テーブルが表示されます。次に、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サーバーのパラダイムと矛盾します。
誰かがここで何が起こっているのか説明できますか?