猿问

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

如何使用List枚举作为 MyBatis 查询的参数?我已经为它创建了一个类型处理程序,并按照另一个问题中的描述指定了映射类型。当它应该是数千时,它返回 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


阿波罗的战车
浏览 224回答 1
1回答

忽然笑

问题是您键入的处理程序根本没有被调用。首先,整个列表被视为一个整体,并作为 JDBC 准备语句的一个参数处理。这意味着单个元素不会通过您指定的类型处理程序进行处理。IN在 JDBC 和 mybatis 中,没有可移植的方法将列表设置为准备好的语句参数(如果您使用的是 postgres,则有办法做到这一点)。如果您使用的是 postgresql,您可以创建一个类型处理程序,该处理程序将接受枚举列表并使用上述问题中描述的方法进行设置。在一般情况下,您需要动态生成查询以分别处理每个值:@Select("<script>select count(*) from enu " +&nbsp; " where appType in ( " +&nbsp; "<foreach item='appType' collection='appTypes' separator=','>" +&nbsp; "&nbsp; &nbsp;#{appType,typeHandler=AppTypeTypeHandler}" +&nbsp; "</foreach>)</script>")int countByType(@Param("appTypes") List<AppType> appTypes);或者,您可以使用@SelectProviderjava 代码使用和构建查询。
随时随地看视频慕课网APP

相关分类

Java
我要回答