gpt4 book ai didi

java - 如果源对象中的字段不为空,MyBatis 会更新

转载 作者:太空宇宙 更新时间:2023-11-04 09:42:04 31 4
gpt4 key购买 nike

使用 MyBatis 注释和动态 SQL,我尝试仅当源对象中的相应字段不为空时才更新表的字段。例如,如果#{srcField}不为空,则设置field=#{srcField}。我不在乎数据库中的字段是否为空。

但是,我没能想出正确的动态 SQL。

我尝试了两种动态sql方法。我的程序可以采用方法1,但它无法检查源对象中的特定字段是否为空。方法 2 会导致一些运行时错误。

带有 setter/getter 的我的 DAO 对象(更新表的源对象):

@Data
public class CityDO {
private Long id;
private String name;
private String description;
}

使用注释和动态sql的Mapper。我试图更新 description字段,仅当 record.description不是null .

方法一,测试失败#{description}!=null ,即使 record.description== 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。异常(exception)是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可能是不必要的(不过没有坏处)。

关于java - 如果源对象中的字段不为空,MyBatis 会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55861001/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com