概述
下面查询,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中就现了原形了,姑且这样猜想,请懂得或者吊大的朋友留言说下。
最后
以上就是微笑萝莉为你收集整理的Mybatis使用时,当查询参数存在于select条件时的全部内容,希望文章能够帮你解决Mybatis使用时,当查询参数存在于select条件时所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复