当前位置: 首页 > 知识库问答 >
问题:

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

冯俊英
2023-03-14

如何使用枚举的列表作为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;
    }
mybatis.type-handlers-package=com.example.mapper

调试日志显示正确的值('A'、'T'、'ST'),但它会为计数打印0。

            System.out.println(badgeMapper.countByType(appTypes));
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> select count(*) from badges where appType in ('A', 'T', 'ST');
+----------+
| count(*) |
+----------+
|     2365 |

MyBatis XML的参考文档:http://www.mybatis.org/mybatis-3/configuration.html#typeHandlers

共有1个答案

国盛
2023-03-14

问题是根本没有调用类型处理程序。

首先,整个列表被视为一个整体,并作为JDBC准备语句的一个参数进行处理。这意味着单个元素不会通过您指定的类型处理程序进行处理。

在JDBC中,因此在mybatis中,没有可移植的方法将列表设置为IN准备好的语句参数(如果使用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);

或者,您可以使用@SseltProvider并使用java代码构建查询。

 类似资料:
  • 如何在常量参数中传递类型值?在这种情况下,此参数仅适用于PARS()常量。 更新:我最终没有在帖子中提到它,但它是一个对象列表,而不是一个字符串。

  • 问题内容: 我有一个电影租借系统的现有数据库。每部电影都有一个评级属性。在SQL中,他们使用约束来限制此属性的允许值。 我认为使用Java枚举将约束映射到对象世界会很好。但是由于“ PG-13”和“ NC-17”中的特殊字符,不可能简单地获取允许的值。因此,我实现了以下枚举: 使用toString()方法,方向enum-> String可以正常工作,但是String-> enum不能正常工作。我得

  • 我有以下endpoint 和下面的用注释 我希望,

  • 问题内容: 我主要是C#开发人员,但目前正在使用Python开发项目。 如何用Python表示等效的枚举? 问题答案: 如PEP 435中所述,将枚举添加到Python 3.4中。它也已在pypi上反向移植到3.3、3.2、3.1、2.7、2.6、2.5和2.4。 对于更高级的Enum技术,请尝试aenum库(2.7、3.3+,与作者相同。py2和py3之间的代码并不完全兼容,例如,您需要__or

  • 问题内容: 在我的MySQL数据库中,有“ gender enum(’male’,’female’)”列 我创建了枚举“ com.mydomain.myapp.enums.Gender”,并在我的实体中定义了“性别”。 现在,我想将枚举类型保留在我的MySQL数据库中,但是当我启动应用程序时,我得到: 性别列在MyApp.Person中的列类型错误。找到:枚举,预期:整数 为什么是这样?这就像我用