mybatis调用存储过程,传入的参数有一个是动态生成了,这个时候会报索引超出范围,如何解决?

一个分页查询存储过程:NBPT_PROCEDURE_PAGING,
第一个参数是一个SQL语句,这个sql语句是动态生成的,但是这里调用时,如果动态生成的话,参数会直接传给存储过程,从而报索引超出范围的错误

<select id="callProcedurePaging" statementType="CALLABLE" parameterType="java.util.HashMap" resultMap="dicdataMap" flushCache="true">
        {call dbo.NBPT_PROCEDURE_PAGING(
        '
        SELECT
        <include refid="Base_Column_List" />
        FROM 
        <include refid="Table_Name" />
        <include refid="Select_Condition" />
        '
        ,
        #{SEARCH_PAGE},#{PAGE_COUNT},#{SEARCH_ORDER},#{COUNTALL,mode=OUT, jdbcType=INTEGER})}
    </select>

下面是动态参数部分的部分截取

<sql id="Select_Condition">
        where 1=1 
        <if test="record.uuid != null and record.uuid != ''">
                AND NBPT_DICDATA_UUID = #{record.uuid}
            </if>
        <if test="record.sort != null and record.sort != ''">
                AND NBPT_DICDATA_SORT = #{record.sort}
            </if>
        <if test="record.label != null and record.label != ''">
                AND NBPT_DICDATA_LABEL = #{record.label}
            </if>
</sql>

报错提示: 索引 5 超出范围。
最终报错的地方在这里,NBPT_DICDATA_TYPE = ? ' , ?,?,?,?),这里有5个问号,因为Select_Condition接收了参数,现在已经测试的结果是,如果这个参数为""或者null的话,也就是Select_Condition只剩下where 1=1 就不会报错

问题追加:
现测试将动态条件改为固定条件
即传入参数为'SELECT * FROM NBPT_DICDATA WHERE 1=1 AND NBPT_DICDATA_TYPE = ''sys_user_sex''',可以查询到结果,于是将条件生成改为了如下

<if test="record.type != null and record.type != ''">
                AND NBPT_DICDATA_TYPE =''${record.type}''
            </if>

结果报错如下:Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 'sys_user_sex' 附近有语法错误。

2个回答

https://blog.csdn.net/song_ysh/article/details/81456572 看看这个帖子,估计是你参数映射有问题

l2963801
ryuukasenn 回复像忘了谁sq: 好吧,最终结果就是我的修改,只是我之前只改了我当时测试的参数,其他的没改,专门写了一个<sql>xxx = ''${xx]''</sql>,现在查询没有问题了
一年多之前 回复
l2963801
ryuukasenn 将第一个参数直接设为 'SELECT * FROM NBPT_DICDATA WHERE 1=1 AND NBPT_DICDATA_TYPE = ''sys_user_sex'''可行, 于是将 xx = #{xx} 改为了 xx = ''${xx}'' 又报语法错误,快疯了
一年多之前 回复
songqiang2011
像忘了谁sq 回复ryuukasenn: 你先写一个你认为对的死值进去试试
一年多之前 回复
l2963801
ryuukasenn NBPT_ROLE_REMARK FROM NBPT_ROLE where 1=1 ' , ?,?,?,?)} ,这个是没有动态条件生成的,其他功能调用同一个存储过程的log,没有问题
一年多之前 回复

将自动生成的参数中,Select_Contditon部分,重新定义,参数写成 xxx=''${xxx}'',就可以了!

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问