Mybatis使用时,当查询参数存在于select条件时

下面查询,para参数是传入的,通过这个参数查询不同的列

<select id="getRecordByEqIdS" resultMap="BaseResultMap">
    SELECT el.#{para,jdbcType=VARCHAR}, el.pick_time
    FROM equipment_log el
    WHERE el.equipment_id = #{pkId,jdbcType=INTEGER}
    ORDER BY el.pick_time DESC
    limit #{count,jdbcType=INTEGER}
</select>

这时候是报错的Translating SQLException with SQL state '42000', error code '1064', message [You have an error in your SQL syntax;

这个错误网上给的解释和问题有点儿不同,细心查找下发现,因为#{para,jdbcType=VARCHAR}中,在形成语句的时候,会把para这个参数外面加上“”双引号,这本是防注入用的,当用在select查询字段中时,自然让数据库辨认不出来。这时可以使用相同的$来替代。

<select id="getRecordByEqIdS" resultMap="BaseResultMap">
    SELECT el.${para,jdbcType=VARCHAR}, el.pick_time
    FROM equipment_log el
    WHERE el.equipment_id = #{pkId,jdbcType=INTEGER}
    ORDER BY el.pick_time DESC
    limit #{count,jdbcType=INTEGER}
</select>

$同样传入参数,但不会给外面加上引号。运行。


引号问题解决,不过报新的错误

nested exception is org.apache.ibatis.binding.BindingException: Parameter 'VARCHAR' not found.

这其中,BindingException有多种原因,暂且不明,但是VARCHAR not found很好看,因为一般就是select了没有的字段,才会出现,这下再看这个para参数,后面的jdbcType被指定为VARCHATR,一定是这里出现问题。

这里考虑:

        Q1.jdbcType是什么作用?

        Q2.jdbcType应该什么时候用?

        Q3.jdbcType是如何实现的?

        A1:作用大致为确定参数的类型,一般常用的是    INTEGER    VARCHAR    TIMESTAMP    DATE


        A2:参数为空的时候,需要指定类型,不然会报错。

        A3:网上并无明确。


因此,去掉这个,再尝试。

<select id="getRecordByEqIdS" resultMap="BaseResultMap">
    SELECT el.${para}, el.pick_time
    FROM equipment_log el
    WHERE el.equipment_id = #{pkId,jdbcType=INTEGER}
    ORDER BY el.pick_time DESC
    limit #{count,jdbcType=INTEGER}
</select>

运行成功了。

推测:根据    Parameter 'VARCHAR' not found.这个来看,有可能在运行时加到了前面参数的后面,会被语句读到,但是一般不会读,但是在select中就现了原形了,姑且这样猜想,请懂得或者吊大的朋友留言说下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值