如何在 MyBatis Spring Boot 中使用枚举列表作为参数?
How do I use a list of enums as parameters in MyBatis Spring Boot?
如何使用 List
枚举作为 MyBatis 查询的参数?我已经为它创建了一个类型处理程序,并按照 in this other question 所述指定了映射类型。它返回 0 计数,而它应该是数千。
@Mapper
public interface BadgeMapper {
@Select("select count(*) from badges where appType in (#{appTypes})")
int countByType(@Param("appTypes") List<AppType> appTypes);
package com.example.mapper;
@MappedTypes({AppType.class})
public class AppTypeTypeHandler implements TypeHandler<AppType> {
@Override
public void setParameter(PreparedStatement ps, int i, AppType parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter.toString()); // use toString not name()
}
public static enum AppType {
ANDROID("A", "Android"), THEME("T", "Theme"), ...
private String val;
private String desc;
AppType(String v, String d) { val = v; desc = d; }
public String toString() {
return val;
}
application.properties
mybatis.type-handlers-package=com.example.mapper
调试日志似乎显示了正确的值('A'、'T'、'ST'),但它打印的计数为 0。
System.out.println(badgeMapper.countByType(appTypes));
Console
c.s.s.mapper.BadgeMapper.countByType : ==> Preparing: select count(*) from badges where appType in (?)
c.s.s.mapper.BadgeMapper.countByType : ==> Parameters: [A, T, ST](ArrayList)
0
MySQL
mysql> select count(*) from badges where appType in ('A', 'T', 'ST');
+----------+
| count(*) |
+----------+
| 2365 |
MyBatis 参考文档XML:http://www.mybatis.org/mybatis-3/configuration.html#typeHandlers
问题是您键入的处理程序根本没有被调用。
首先,整个列表被视为一个整体,并作为 JDBC 准备语句的一个参数处理。这意味着单个元素不会通过您指定的类型处理程序进行处理。
在 JDBC 中没有将列表设置为 IN
准备语句参数的可移植方法,因此在 mybatis 中(如果您使用的是 postgres,则有 ways 可以做到这一点) .
如果您使用的是 postgresql,则可以创建一个类型处理程序,它将接受枚举列表并使用上述问题中描述的方法进行设置。
在一般情况下,您需要动态生成查询以分别处理每个值:
@Select("<script>select count(*) from enu " +
" where appType in ( " +
"<foreach item='appType' collection='appTypes' separator=','>" +
" #{appType,typeHandler=AppTypeTypeHandler}" +
"</foreach>)</script>")
int countByType(@Param("appTypes") List<AppType> appTypes);
或者您可以使用 @SelectProvider
并使用 java 代码构建查询。
如何使用 List
枚举作为 MyBatis 查询的参数?我已经为它创建了一个类型处理程序,并按照 in this other question 所述指定了映射类型。它返回 0 计数,而它应该是数千。
@Mapper
public interface BadgeMapper {
@Select("select count(*) from badges where appType in (#{appTypes})")
int countByType(@Param("appTypes") List<AppType> appTypes);
package com.example.mapper;
@MappedTypes({AppType.class})
public class AppTypeTypeHandler implements TypeHandler<AppType> {
@Override
public void setParameter(PreparedStatement ps, int i, AppType parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter.toString()); // use toString not name()
}
public static enum AppType {
ANDROID("A", "Android"), THEME("T", "Theme"), ...
private String val;
private String desc;
AppType(String v, String d) { val = v; desc = d; }
public String toString() {
return val;
}
application.properties
mybatis.type-handlers-package=com.example.mapper
调试日志似乎显示了正确的值('A'、'T'、'ST'),但它打印的计数为 0。
System.out.println(badgeMapper.countByType(appTypes));
Console
c.s.s.mapper.BadgeMapper.countByType : ==> Preparing: select count(*) from badges where appType in (?)
c.s.s.mapper.BadgeMapper.countByType : ==> Parameters: [A, T, ST](ArrayList)
0
MySQL
mysql> select count(*) from badges where appType in ('A', 'T', 'ST');
+----------+
| count(*) |
+----------+
| 2365 |
MyBatis 参考文档XML:http://www.mybatis.org/mybatis-3/configuration.html#typeHandlers
问题是您键入的处理程序根本没有被调用。
首先,整个列表被视为一个整体,并作为 JDBC 准备语句的一个参数处理。这意味着单个元素不会通过您指定的类型处理程序进行处理。
在 JDBC 中没有将列表设置为 IN
准备语句参数的可移植方法,因此在 mybatis 中(如果您使用的是 postgres,则有 ways 可以做到这一点) .
如果您使用的是 postgresql,则可以创建一个类型处理程序,它将接受枚举列表并使用上述问题中描述的方法进行设置。
在一般情况下,您需要动态生成查询以分别处理每个值:
@Select("<script>select count(*) from enu " +
" where appType in ( " +
"<foreach item='appType' collection='appTypes' separator=','>" +
" #{appType,typeHandler=AppTypeTypeHandler}" +
"</foreach>)</script>")
int countByType(@Param("appTypes") List<AppType> appTypes);
或者您可以使用 @SelectProvider
并使用 java 代码构建查询。