Чистый способ сохранить поле перечисления с JDBI3? - PullRequest
0 голосов
/ 24 августа 2018

Я создаю приложение с помощью Dropwizard и хочу, чтобы у одного из моих постоянных объектов было поле enum:

class DogEntity {
  public String name;
  public DogType type;
}

enum DogType {
  HUSKY("canis lupus familiaris"),
  LAB("canus familiaris")

  private final String value;

  Type(String value) {
    this.value = value;
  }
}

Как мне заставить JDBI сохранить значение типа DogType в базе данных, в отличие от имени или порядкового номера?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Вот решение, с которым я столкнулся:

public class DogTypeArgumentFactory implements ArgumentFactory {
  @Override
  public Optional<Argument> build(Type type, Object value, ConfigRegistry config) {
    if (value == null || !type.getTypeName().equals(DogType.class.getName())) {
      return Optional.empty();
    }

    return Optional.of(new DogTypeArgument((DogType) value));
  }


  private class DogTypeArgument implements Argument {
    private final DogType value;

    private DogTypeArgument(DogType value) {
      this.value = value;
    }

    @Override
    public void apply(
        int position, PreparedStatement statement, StatementContext context) throws SQLException {

      statement.setInt(position, value.getValue());
    }
  }
}

Это выглядит немного скучно, если мне нужно использовать его для каждого постоянного значения enum ... Я полагаю, что все они могут использовать общий интерфейс, если это работает.

0 голосов
/ 25 августа 2018

Из коробки Jdbi 3 поддерживает Enum в качестве типа аргумента, но он сохраняется как имя значения перечисления.

Но вы можете использовать Настраиваемые аргументы для типов данных, которыеизначально не поддерживается Jdbi.

Примером для Argument Factory для вашего случая будет:

public class DogTypeArgumentFactory extends AbstractArgumentFactory<DogType> {

public DogTypeArgumentFactory() {
    super(Types.VARCHAR);
}

@Override
public Argument build(final DogType dogType, ConfigRegistry config) {
    return new Argument() {
        @Override
        public void apply(int position, PreparedStatement statement, StatementContext ctx) throws SQLException {
            statement.setString(position, dogType.getValue());
        }
    };
  }  
}
...