如何使用List枚举作为 MyBatis 查询的参数?我已经为它创建了一个类型处理程序,并按照另一个问题中的描述指定了映射类型。当它应该是数千时,它返回 0 个计数。@Mapperpublic 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.propertiesmybatis.type-handlers-package=com.example.mapper调试日志似乎显示了正确的值('A'、'T'、'ST'),但它打印的计数为 0。 System.out.println(badgeMapper.countByType(appTypes));Consolec.s.s.mapper.BadgeMapper.countByType : ==> Preparing: select count(*) from badges where appType in (?)c.s.s.mapper.BadgeMapper.countByType : ==> Parameters: [A, T, ST](ArrayList) 0MySQLmysql> select count(*) from badges where appType in ('A', 'T', 'ST');+----------+| count(*) |+----------+| 2365 |MyBatis XML 的参考文档:http ://www.mybatis.org/mybatis-3/configuration.html#typeHandlers
1 回答
忽然笑
TA贡献1806条经验 获得超5个赞
问题是您键入的处理程序根本没有被调用。
首先,整个列表被视为一个整体,并作为 JDBC 准备语句的一个参数处理。这意味着单个元素不会通过您指定的类型处理程序进行处理。
IN在 JDBC 和 mybatis 中,没有可移植的方法将列表设置为准备好的语句参数(如果您使用的是 postgres,则有办法做到这一点)。
如果您使用的是 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);
或者,您可以使用@SelectProviderjava 代码使用和构建查询。
添加回答
举报
0/150
提交
取消