#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. спасибо, что изучили эту проблему. Я включил ведение журнала и отладил приложение, и проблема была связана с данными. Таблица, к которой он был подключен, имела другой набор записей.