首页 > 解决方案 > MyBatis 3.4.5;@SelectProvider 不替换参数占位符

问题描述

当我尝试使用 MyBatis 创建动态查询时,sql 已成功生成,但参数未在 SQL 占位符中替换。

映射器@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 字符串打印正确,我可以看到占位符。不知道我错过了什么。

标签: javamybatis

解决方案


盲目猜测:您使用了错误的@Param注释。

确保你有: import org.apache.ibatis.annotations.Param;

并不是: import org.springframework.data.repository.query.Param;

打印params地图的内容以验证此声明。


推荐阅读