为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 MyBatis Spring Boot 中使用枚举列表作为参数?

如何在 MyBatis Spring Boot 中使用枚举列表作为参数?

阿波罗的战车 2022-07-14 16:22:17
如何使用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 代码使用和构建查询。


查看完整回答
反对 回复 2022-07-14
  • 1 回答
  • 0 关注
  • 223 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信