1

在使用 Circe 和 Quill 处理枚举值时,我们成功地使用了 enumeratum。我们定义如下:

 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在使用 Quill 和 Circe 解码/编码 mysql 和 json 时使用。使用 Quill 和 MySQL,这适用于下表:

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

但是,当为我们的枚举类型和可为空的 MySQL 类型使用可选字段时,我终生无法弄清楚如何使这项工作发挥作用。

我们希望能够像这样使用有效负载类:

   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)

是不是我们需要指定一些自定义解码器/编码器来处理选项/空值?

4

0 回答 0