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

时间:2019-02-28 23:08:06

标签: java mybatis spring-annotations spring-mybatis java-annotations

如何使用create procedure hozzaszolas @pHozzaszolasSzam int , @pmcsz int output as begin update Cikkek set Ertekeles = Ertekeles + 1 where Cikkek.CikkCim in ( select Cikkek.CikkCim from Cikkek left join Hozzaszolasok on Cikkek.CikkID = Hozzaszolasok.CikkID where Cikkek.Ertekeles < 10 group by Cikkek.CikkID, Cikkek.CikkCim having count(Hozzaszolasok.CikkID) >= @pHozzaszolasSzam ) end 枚举作为MyBatis查询的参数?我已经为其创建了一个类型处理程序,并按照in this other question的说明指定了映射类型。当它应为千时,它返回0计数。

List

@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

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

mybatis.type-handlers-package=com.example.mapper
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

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

1 个答案:

答案 0 :(得分:1)

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

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

在JDBC中,因此在mybatis中,没有一种可移植的方法将列表设置为IN个准备好的语句参数(如果使用的是postgres,则有ways可以做到)。

如果使用的是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);

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