java - 将动态参数传递给 @MapKey ("${dynamicParam}") (My-Batis)

标签 java mybatis

是否可以将动态参数传递给@MapKey注释?我必须动态选择表的键来在 map 中构造表结果。

我尝试传递动态参数,就像我们使用 ${} 语法对任何 SQL 查询所做的那样。

不起作用

@MapKey("${tablePk}")
 @Select("${sql}")
 Map doGenericOperation(@Param("sql") String sql, @Param("tablePk") String tablePk);

作品

@MapKey("id")
 @Select("${sql}")
 Map doGenericOperation(@Param("sql") String sql, @Param("tablePk") String tablePk);

map 键在这种情况下不适用。但是如果我通过的话 @Map("id") 工作完美。

最佳答案

不,这是不可能的。

当您将整个 sql 作为字符串传递时,应该可以预先为主键分配固定别名。

此外,无需使用 @MapKey 即可轻松实现您想要的目标。

@Select("${sql}")
List<Map<String, ?>> doGenericOperation_Internal(@Param("sql") String sql);

default Map<?, Map<String, ?>> doGenericOperation(String sql, String tablePk) {
  return doGenericOperation_Internal(sql).stream()
    .collect(Collectors.toMap(e -> e.get(tablePk), e -> e));
}

请确保不要将任何用户提供的字符串作为 sql 的一部分传递,以避免 SQL 注入(inject)!

关于java - 将动态参数传递给 @MapKey ("${dynamicParam}") (My-Batis),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56249768/

相关文章:

java - Comparable Generic 如何使用 ist

java - 访问者如何以迭代器不会的方式访问 "define a new operation"?

java - Webdriver - Firefox 56(64 位)更新后超时不起作用

Java:使用 Stream 连接两个 Map<String, Object> 列表

java - 如何使用mybatis按参数分组

java - MyBatis中设置空参数时不添加jdbcType有什么解决办法吗?

java - 从日期转换为日期时间时如何删除时区

spring - MyBatis-Spring + @Configuration - 无法 Autowiring 映射器 bean

jdbc - 在ibatis中获取批量插入/更新的更新计数

java - 带有 MyBatis TypeHandler 的空对象模式