[英]MyBatis update if a field in the source object is not null
使用MyBatis批注和动态SQL,仅当源对象中的对应字段不为null时,我才尝试更新表的字段。 例如,如果#{srcField}不为null,则设置field =#{srcField}。 我不在乎数据库中的字段是否为空。
但是,我无法提出正确的动态SQL。
我尝试了两种动态sql方法。 我的程序可以采用方法1,但是无法检查源对象中的特定字段是否为空。 方法2会导致一些运行时错误。
我的带有setter / getter的DAO对象(用于更新表的源对象):
@Data
public class CityDO {
private Long id;
private String name;
private String description;
}
映射器使用注释和动态sql。 只有在record.description
不为null
,我才尝试更新description
字段。
方法1,即使record.description == null
,也未通过测试#{description}!=null
null
。 每次生成的sql包含SET description = ?
。
@Update({
"<script>",
"update city",
"<set>",
"<if test='#{description} != null'>description = #{description,jdbcType=VARCHAR},</if>",
"</set>",
"where name = #{name,jdbcType=VARCHAR}",
"</script>"
})
@Override
int update(CityDO record);
方法2,唯一的区别是我在测试条件下添加了jdbcType。 异常的原因是Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'VARCHAR' in 'class com.mycode.CityDO'
"<if test='#{description,jdbcType=VARCHAR} != null'>description = #{description,jdbcType=VARCHAR},</if>",
如果有人可以告诉我如何使其工作,以及是否有参考解决方案(即使是基于xml的解决方案也可以),我将不胜感激。
以下应该工作。
<if test='description != null'>
test
属性的值由OGNL评估,而#{}
是MyBatis引用参数/属性的方式。 而且,在您的情况下, jdbcType
可能是不必要的(尽管没有危害)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.