首页 > 解决方案 > MyBatis XML Mapper 文件中的 Oracle 错误,但在 SQL Developer 中没有

问题描述

我在 MyBatis XML 包装器中有一个查询,结果是ORA-00904 invalid identifier. 但是,当我复制日志中显示的语句时,它会运行。

日志消息是

SQL: select /*+ parallel(AUTO) */ avg(DURATION) AVERAGE_SESSION_DURATION              
from sc_report_new.sc_hub_session_activity schsa             
    inner join sc_hub_users schu on schsa.user_key=schu.user_key             
    inner join sc_hub_user_types schut on chut.user_type_id=schu.user_type_id             
    inner join sc_hub_content_master schcm on chcm.trace_id_key=schsa.hub_key                                                     
WHERE schsa.FISCAL_QUARTER_ID = '2020Q2'

原因:java.sql.SQLSyntaxErrorException:ORA-00904:“SCHSA”。“FISCAL_QUARTER_ID”:标识符无效

    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:149)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:76)

映射器查询的片段是

    <select id="getDashboardAverageSessionDuration" 
            resultType="int" 
            parameterType="com.mycompany.salesconnect.screport.model.AuthorizedHubRequest">
            select /*+ parallel(AUTO) */ 
                   avg(DURATION) AVERAGE_SESSION_DURATION 
            from sc_report_new.sc_hub_session_activity schsa
            inner join sc_hub_users schu
            on schsa.user_key=schu.user_key
            inner join sc_hub_user_types schut
            on schut.user_type_id=schu.user_type_id
            inner join sc_hub_content_master schcm
            on schcm.trace_id_key=schsa.hub_key
            <include refid="com.mycompany.salesconnect.screport.mapper.hubportfolio.Common.joinHubAuthorizations">
                <property name="hubAuthorizations" value="hubAuthorizations"/>
            </include>
            <where>
                 <if test="hubRequestFilter.dateRangeSpecified">
                     schsa.time_stamp
                     BETWEEN to_date(#{hubRequestFilter.fromDate}, 'mm/dd/yyyy') 
                     AND
                            to_date(#{hubRequestFilter.toDate}, 'mm/dd/yyyy') 
                 </if>
                 <if test="!hubRequestFilter.dateRangeSpecified">
                    <if test="hubRequestFilter.quarterListByNameNotEmpty">
                        SCHSA.FISCAL_QUARTER_ID IN 

                        <foreach item="quarterName" collection="hubRequestFilter.quarterListByName" open="(" close=")" separator=",">
                            <bind name="quarterId" 
                                  value="@com.mycompany.salesconnect.screport.dao.SCHubPortfolioUtil@getQuarterAsId(quarterName)"/>
                             #{quarterName}
                        </foreach>
                    </if>
                    <if test="hubRequestFilter.quarterListByIdNotEmpty">
                       SCHSA.FISCAL_QUARTER_ID IN 
                       <foreach item="quarterId" collection="hubRequestFilter.quarterListById" open="(" close=")" separator=",">
                             #{quarterId}
                        </foreach>
                    </if>
                    
                 </if>
                <include refid="com.mycompany.salesconnect.screport.mapper.hubportfolio.Common.whereHubRequestFilter"><property name="hubRequestFilter" value="hubRequestFilter"></property></include>
                <include refid="com.mycompany.salesconnect.screport.mapper.hubportfolio.Common.whereHubAuthorizations"><property name="hubAuthorizations" value="hubAuthorizations"></property></include>
            </where>
    </select>

我在 XML 中查找不可打印的字符,但没有看到任何字符。说明什么应该很明显,SC_HUB_SESSION_ACTIVITY 表有一个 FISCAL_QUARTER_ID 字段。有趣的是,如果我选择另一个 SCHSA 列,它会起作用。出于某种原因,系统将这个字段单选为任意不工作。

标签: oraclemybatis

解决方案


这不是 MyBatis 的问题,而是指向与我使用的 SQL Developer 相同的数据库。


推荐阅读