Обновление MyBatis, если поле в исходном объекте не является нулевым - PullRequest
1 голос
/ 26 апреля 2019

Используя аннотацию 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, это хорошо).

1 Ответ

0 голосов
/ 26 апреля 2019

Должно работать следующее.

<if test='description != null'>

Значение атрибута test оценивается OGNL, тогда как #{} является способом ссылки на параметр / свойство MyBatis.И, в вашем случае, jdbcType s может быть ненужным (хотя вреда нет).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...