Используя аннотацию MyBatis и динамический SQL, я пытался обновить поле таблицы, только если соответствующее поле в исходном объекте не равно NULL. Например, если # {srcField} не равен NULL, установите поле = # {srcField}. Мне все равно, если поле в БД пустое или нет.
Однако мне не удалось найти правильный динамический SQL.
Я попробовал два динамических подхода SQL. Подход 1 может быть принят моей программой, но он не смог проверить, является ли определенное поле в исходном объекте пустым. Подход 2 вызывает некоторую ошибку во время выполнения.
Мой объект DAO с установщиком / получателем (исходный объект для обновления таблицы):
@Data
public class CityDO {
private Long id;
private String name;
private String description;
}
Mapper с использованием аннотации и динамического sql. Я пытался обновить поле description
, только если record.description
не null
.
Подход 1, он не прошел тест #{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 в условие теста. Исключение составляет 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, это хорошо).