MyBatis 3.4.5; @SelectProvider не заменяет заполнители параметров

#java #mybatis

#java #mybatis

Вопрос:

Когда я пытаюсь создать динамический запрос с помощью MyBatis, sql генерируется успешно, но параметры не заменяются в заполнителях SQL.

Определение Mapper @SelectProvider

 @SelectProvider(type = ActivitySqlProvider.class, method = "getActivitiesByUserAndType")
@ResultMap("activityResult")
List<Activities> getActivities(@Param("userId") long userId, @Param("type") String type);
  

Класс ActivitySqlProvider

 public String getActivitiesByUserAndType(final Map<String, Object> params) {

  String COLUMNS = "ACTIVITYID, USERID, TYPE, CREATED, DESCRIPTION";
  String TABLE_NAME = "ACTIVITY";

  boolean hasType = params.containsKey("type");

  final String sql = new SQL() {{
    SELECT(COLUMNS);
    FROM(TABLE_NAME);
    WHERE("USERID = #{userId}");

    if (hasType) {
      WHERE("TYPE = #{type}");
    }

  }}.toString();

  System.out.println(sql);
  return sql;
}
  

Строка SQL напечатана правильно, и я вижу заполнители. Не уверен, чего мне не хватает.

Ответ №1:

Слепое предположение: вы используете неправильную @Param аннотацию.

Убедитесь, что у вас есть: import org.apache.ibatis.annotations.Param;

и не: import org.springframework.data.repository.query.Param;

Распечатайте содержимое params карты, чтобы подтвердить это утверждение.

Комментарии:

1. Спасибо за ваш ответ. Я импортировал правильный пакет, карта содержит параметры, которые были переданы.

2. Возможно, это не поможет, но я вставил ваш код как есть, и он отлично работает.

3. Ох… Круто, спасибо, что проверили это. Ценю это. Какая-либо конфигурация, которую я, возможно, пропустил? Должен ли класс ActivitySqlProvider быть аннотирован или что-то в этом роде?

4. Нет аннотаций в ActivitySqlProvider, @Mapper в ActivityMapper. Я использовал mybatis-spring-boot-starter, чтобы быстро подключить его.

5. спасибо, что изучили эту проблему. Я включил ведение журнала и отладил приложение, и проблема была связана с данными. Таблица, к которой он был подключен, имела другой набор записей.