MyBatis传入Integer类型使用if判断时会报错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis传入Integer类型使用if判断时会报错相关的知识,希望对你有一定的参考价值。

<select id="select" resultType="com.huafu.controller.entity.ProductCatalogEntity">
select * from f_product_catalog where 1 = 1
<if test="_parameter!=null">
and id=#_parameter
</if>
</select> 正确
<select id="select" resultType="com.huafu.controller.entity.ProductCatalogEntity">
select * from f_product_catalog where 1 = 1
<if test="id!=null">
and id=#id//id为Integer类型
</if>
</select>就错报
There is no getter for property named 'id' in 'class java.lang.Integer' 在网上查了很多说是用_parameter,试了不会报错 可这只能传一个参数,如果传多个int 类型的值要怎么办?我放到map中还是会报上面的那个错

可以用parameterType指定参数类型啊,如果要判断多个值,可以定义一个vo类,把要判断的字段包进去,判断和传值的时候通过对象点的方法就可以了,很方便

可以这样用

忘了说,我这个是MyBatis版本是3.2.7

追问

还是会报那个错啊 实体中的id也是integer类型

追答

那你这种写法试一下 传参时把id=#id改为id=$id

select * from f_product_catalog where 1 = 1

and id=$id//id为Integer类型

猜测可能是因为#{}这种方式使用的是ognl解析参数,
改成这种${}应该就可以,但是这样可能会存在sql注入的危险

追问

我这个也是3.2.7

追答

还不行吗?判断时,用where子句要方便一些

追问

我把实体的属性id改成String了这样就没事了,对了 我想问下大于小于在配置文件里怎么写啊?能用我发的代码写个例子么 我在网上找了半天写的都不一样 还是不知道该加在哪

追答

你代码里没有大小于号,不知道你是这个意思吗:


第一个方法:         

对应 <

  对应 >直接在sql里把>或<换过来

 第二个方法:

    用这种<![CDATA[]]> 把你的sql包起来


            例如:<![   CDATA[你的sql   ]]>

参考技术A 你可以指定类型;
BIT         FLOAT      CHAR           TIMESTAMP       OTHER       UNDEFINEDTINYINT     REAL       VARCHAR        BINARY          BLOB        NVARCHARSMALLINT    DOUBLE     LONGVARCHAR    VARBINARY       CLOB        NCHAR
INTEGER     NUMERIC    DATE           LONGVARBINARY   BOOLEAN     NCLOB
BIGINT      DECIMAL    TIME           NULL            CURSOR
这些都是myBatis支持的类型  你可以这么写 #id,jdbcType=INTEGER

追问

不行的还是会报那个错

追答

你没指定这个sql语句需要参数传入 在

关于INTEGER 类型在Mybatis中使用if的注意

Mybatis中是使用<if>用来编写动态语句是很方便的一个操作,不过在最近的项目开发中当使用的一个变量为inteter类型的时候,用<if>来编写发现有点问题,源码如下面:

<update id="updateWeightintervalInfo" parameterType="com.exiao.platform.core.logistics.data.WeightInterval">
		update tm_weightinterval SET
		<if test="wgtintervalCode!=null and wgtintervalCode !=‘‘">
			wgtintervalcode=#{wgtintervalCode},
		</if>
		<if test="intervalName!=null and intervalName!=‘‘">
			intervalname=#{intervalName},
		</if>
		<if test="transportMode!=null and transportMode!=‘‘">
			transportmode=#{transportMode},
		</if>
		<if test="vendorCode !=null and vendorCode !=‘‘">
			vendorcode=#{vendorCode},
		</if>
		<if test="departurecityCode!=null and departurecityCode!=‘‘">
			departurecitycode=#{departurecityCode},
		</if>
		<if test="minWeight !=null and minWeight !=‘‘">
			minweight=#{minWeight},
		</if>
		<if test="maxWeight != null and maxWeight !=‘‘">
			maxweight=#{maxWeight},
		</if>
		<if test="firstWeight !=null and firstWeight !=‘‘">
			firstweight=#{firstWeight},
		</if>
		<if test="addedWeight != null and addedWeight!=‘‘">
			addedweight=#{addedWeight},
		</if>
		<if test="sortSeq!=null and sortSeq!=‘‘">
			sortseq=#{sortSeq},
		</if>
		<if test="enabled!=null and enabled!=‘‘">
			enabled=#{enabled},
		</if>
		update_time=#{updateTime},
		updator=#{updator}
		WHERE wgtintervalid=#{id}
	</update>

其中enabled是interger类型,其中用0表示无效,1表示有效。如果传值为0的时候,按照if的逻辑则不判断为false不执行当中的语句。经过查找资料,只需要把代码中的enabled!=‘’去掉则可以正常使用。

以上是关于MyBatis传入Integer类型使用if判断时会报错的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis解析<if>动态sql时,Integer类型值为0,返回false

如何解决mybatis在xml中传入Integer整型参数为0时查询条件失效问题?亲测有效

if判断Integer类型的值不等于‘‘导致的查询条件限制缺失

Mybatis判断Integer失效

mybatis使用if判断参数是否为空

mybatis判断Long,Integer类型的条件是否为空