mybatis查询报错Parameter index out of range (3 > number of parameters, which is 2).

本文介绍了一个复杂的SQL查询案例,该查询用于统计不同公司业务的数据,包括案例数量、业务数量及查询数量等。通过左连接多个表,并使用条件过滤,实现了灵活的数据汇总。
<select id="getDistinctCompanyBusiness"
        parameterType="java.util.Map"
        resultType="com.qy.insurance.ls.adjust.dto.company.CompanyStatisticsResponse">

    SELECT
    e.client_name as companyName,
    d.class_name as termName,
    COUNT(a.flow_Id) as caseAmount,
    COUNT(c.id) as businessAmount,
    COUNT(b.id) as queryAmount
    FROM
    t_amount_case a
    LEFT JOIN
    t_calc_billinfo b
    ON
    a.flow_Id=b.flowId
    LEFT JOIN
    t_amount_business c
    ON
    a.flow_Id=c.flow_Id
    LEFT JOIN
    t_class d
    ON
    c.class_code=d.class_code
    LEFT JOIN
    t_client e
    ON
    a.client_code=e.client_code
    GROUP BY
    a.client_code

    <where>
        <if test="startDate != null">
            AND a.statistical_time >= #{startDate}
        </if>
        <if test="endDate != null">
            AND a.statistical_time &lt;= #{endDate}
        </if>
        <if test="client_code != '' and client_code != null">
            AND a.client_code = #{clientCode,jdbcType=VARCHAR}
        </if>
        <if test="classCode != '' and classCode != null">
            AND c.class_code = #{classCode,jdbcType=VARCHAR}
        </if>
        <if test="businessType != '' and businessType != null">
            AND a.bill_type = #{businessType,jdbcType=VARCHAR}
        </if>
    </where>

</select>

 GROUP BY

a.client_code

应该写在where后面!!!!

### ### 错误原因 `Parameter index out of range (2 > number of parameters, which is 1)` 错误通常出现在使用 JDBC 或 MyBatis 执行 SQL 语句时,表示试图设置第 2 个参数,但 SQL 语句中只包含 1 个参数占位符。这可能是由于 SQL 语句中参数占位符的数量与实际传入的参数数量不一致导致的 [^1]。 一种常见情况是 SQL 语句中动态拼接了参数,但条件判断未生效,导致某些参数未被正确识别。例如在 MyBatis 的动态 SQL 中,如果 `<if>` 条件未满足,相应的 `#{}` 占位符将不会被解析,从而导致参数索引越界 [^3]。 另一种情况是在 SQL 语句中错误地使用了注释或特殊字符,例如 `--` 或 `<![CDATA[]]>`,这些内容可能被误认为是参数占位符,从而导致参数数量不匹配 [^5]。 此外,SQL 语句中可能包含了被注释掉的参数部分,例如在 `<select>` 标签中使用了 `#` 或 `--` 注释,但这些注释未被正确处理,导致框架误认为存在多个参数 [^4]。 ### ### 示例代码 ```java @Select({ "<script>", "select aaa.user_id, aaa.user_account, bbb.realname, aaa.project_role ", "from table_name1 aaa ", "left join table_name2 bbb on aaa.user_account = bbb.account ", "where project_id = #{projectId,jdbcType=INTEGER} ", "<if test = \"name != null and name != &#39;&#39; \">", "AND (bbb.account like &#39;%#{name}%&#39; or bbb.realname like &#39;%#{name}%&#39;) ", "</if>", "</script>" }) @Results({ @Result(column="user_id", property="userId", jdbcType=JdbcType.INTEGER), @Result(column="user_account", property="userAccount", jdbcType=JdbcType.VARCHAR), @Result(column="realname", property="realname", jdbcType=JdbcType.VARCHAR), @Result(column="project_role", property="projectRole", jdbcType=JdbcType.VARCHAR) }) List<ProjectUserDTO> selectProjectUserDTO(@Param("projectId") Integer projectId, @Param("name") String name); ``` 在上述代码中,如果 `name` 参数为 `null` 或空字符串,MyBatis 的 `<if>` 判断将不会执行,导致 SQL 语句中只包含 `#{projectId}` 一个参数,但调用时仍然传入两个参数,从而引发索引越界错误 [^3]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值