首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MyBatis Spring中使用枚举列表作为参数?

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

Stack Overflow用户
提问于 2019-02-28 23:08:06
回答 1查看 1K关注 0票数 0

如何使用枚举的List作为MyBatis查询的参数?我已经为它创建了一个类型处理程序,并按照描述的in this other question指定了映射的类型。当它应该是数千时,它返回0计数。

代码语言:javascript
复制
@Mapper
public interface BadgeMapper {
    @Select("select count(*) from badges where appType in (#{appTypes})")
    int countByType(@Param("appTypes") List<AppType> appTypes);
代码语言:javascript
复制
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()
    }
代码语言:javascript
复制
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

代码语言:javascript
复制
mybatis.type-handlers-package=com.example.mapper

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

代码语言:javascript
复制
            System.out.println(badgeMapper.countByType(appTypes));

Console

代码语言:javascript
复制
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

代码语言:javascript
复制
mysql> select count(*) from badges where appType in ('A', 'T', 'ST');
+----------+
| count(*) |
+----------+
|     2365 |

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-01 13:07:28

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

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

在JDBC中以及因此在myb提斯中,没有可移植的方法将列表设置为IN准备的语句参数(如果您正在使用postgres,则有ways可以这样做)。

如果使用postgresql,则可以创建一个类型处理程序,该处理程序将接受枚举列表,并使用上述问题中描述的方法设置枚举列表。

在一般情况下,需要动态生成查询以单独处理每个值:

代码语言:javascript
复制
@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代码构建查询。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54935679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档