Как я могу преобразовать целое число в перечисление в MyBatis? - PullRequest
0 голосов
/ 09 октября 2018

У меня есть следующее:

public class Stat {

    public enum HitType {
        MOBILE1(0), MOBILE2(1), DESKTOP(2);
        public final int value;
        public int value() { return value; }
        HitType(int val) {
            value = val;
        }
        public static HitType parseInt(int i) {
            switch (i) {
                case 0: return MOBILE1;
                case 1: return MOBILE2;
                case 2: return DESKTOP;
                default: return null;
            }
        }
    }

    public HitType hitType;
    public long sourceId;

    public Stat(... int hitType, BigInteger sourceId) {
        this.hitType = HitType.parseInt(hitType);
        this.sourceId = sourceId.longValueExact();

@Mapper
public interface StatMapper {

    @Select("select * from stats where id = #{id}")
    @Results(value = {
        @Result(property = "hitType", column = "hit_type"),
        ...
        })
    public Stat findById(@Param("id") long id);

    Stat s = statMapper.findById(1);
    response.getOutputStream().print(s.toString());

Все равно выдает эту ошибку:

Устранено исключение, вызванное выполнением обработчика: org.mybatis.spring.MyBatisSystemException: вложенное исключение - org.apache.ibatis.executor.result.ResultMapException: Ошибка при попытке получить столбец hit_type из набора результатов.Причина: java.lang.IllegalArgumentException: нет константы перечисления com.company.app.model.Stat.HitType.2

Я попытался /7497668/privedite-int-dlya-perechisleniya-v-java#7497685 и прочитал Преобразовать целочисленное значение всоответствие Java Enum .

Если я изменю сигнатуру конструктора на

public Stat(..., int hitType, long sourceId) {
    this.sourceId = sourceId;

, тогда выдается ошибка

Вложенное исключение org.apache.ibatis.executor.ExecutorException: Нетнайден конструктор в com.company.app.model.Stat, соответствующий [java.math.BigInteger, java.lang.String, java.sql.Timestamp, java.lang.Integer, java.math.BigInteger]

Так что в первом случае кажется, что это может быть установка свойств напрямую, а во втором случае он использует конструктор.

Я попытался поместить HitType hitType в сигнатуру конструктора, но все равно выдает ошибку No constructor found....

MyBatis 3.4.5, MyBatis-Spring 1.3.1, Spring-Boot 1.5+0,13

1 Ответ

0 голосов
/ 09 октября 2018

Я добавил геттер и сеттер для этого типа

public HitType getHitType() {
    return hitType;
}

public void setHitType(int hitType) {
    this.hitType = HitType.parseInt(hitType);
}

И тогда он начал работать.Что странно, потому что он жаловался на подпись конструктора.Если он использует конструктор, зачем ему геттеры и сеттеры?

...