Используйте необязательное поле StringEnumEntry в классе case с Quill в Scala

Мы успешно используем enumeratum при работе со значениями enum, как с Circe, так и с Quill. Мы определяем что-то вроде этого:

 sealed abstract class TopicType(val value: String) extends StringEnumEntry
  object TopicType extends StringEnum[TopicType] with StringCirceEnum[TopicType] with StringQuillEnum[TopicType] {
    object Info extends TopicType("info")
    object Warning extends TopicType("warning")

    val values: immutable.IndexedSeq[TopicType] = findValues
  }

  // case class representing our MySQL payload table 
  case class Payload(id: String, topic: TopicType)

и использовать Payloadпри декодировании / кодировании mysql и json с использованием Quill и Circe. С Quill и MySQL это отлично работает со следующей таблицей:

create table payload(
    id varchar(36) not null primary key,
    topic_type enum ('info', 'warning')  not null
)

Однако, хоть убей, я не могу понять, как заставить эту работу работать при использовании дополнительных полей для нашего перечисляемого типа и типов MySQL, допускающих значение NULL.

Мы хотим иметь возможность использовать такой класс полезной нагрузки:

   case class Payload(id: String, topic: Option[TopicType])

и с такой таблицей SQL (topic_type может быть нулевым):

create table payload(
    id varchar(36) not null primary key,
    topic_type enum ('info', 'warning')
)

При попытке использовать необязательный topic и читать из нашей базы данных с помощью Quill с помощью:

...
run {
   query[Payload].filter(payload => payload.id == lift(someId))
}

мы получили

java.util.NoSuchElementException: null is not a member of ValueEnum (warning, info) (ValueEnum.scala:58)

Может быть, нам нужно указать какой-то настраиваемый декодер / кодировщик для обработки параметров / нулевых значений?

0 ответов

Другие вопросы по тегам