Я пытаюсь использовать перечисление Scala 2 с Quill, например:
import io.getquill.MappedEncoding
object MyEnumType extends Enumeration {
type MyEnumType = Value
val ONE, TWO, THREE = Value
implicit val encode: MappedEncoding[MyEnumType, String] =
MappedEncoding(_.toString)
implicit val decode: MappedEncoding[String, MyEnumType] =
MappedEncoding(MyEnumType.withName)
}
Но я получаю ошибку от Postgres:
ERROR: operator does not exist: my_enum_type = character varying
Hint: No operator matches the given name and argument types. You might need to add explicit type casts.
Я распечатываю запрос, используя translate, и запрос генерируется так:
WHERE column_1 = ONE
Где я ожидаю, что он будет отображаться следующим образом:
WHERE column_1 = 'ONE'
Как правильно обрабатывать перечисления с помощью Quill в Scala 2.13?
Я экспериментировал, в том числе с использованием библиотеки Enumeratum, и значения перечисления все еще не генерируются правильно.
Используя отладчик, я вижу, что пользовательский кодировщик оценивается, но результирующее значение никогда не попадает в сгенерированный запрос.
Я разместил пример проблемы здесь:
https://gist.github.com/daharon/97e8b167911723054ac3845fc35c0b11





Попробуйте добавить цитаты
implicit val encode: MappedEncoding[MyEnumType, String] =
MappedEncoding(x => s"'$x'")
implicit val decode: MappedEncoding[String, MyEnumType] =
MappedEncoding(s => MyEnumType.withName(s.stripPrefix("'").stripSuffix("'")))
@daharon Да, ты должен import MyEnumType._. object MyEnumType не является сопутствующим объектом, потому что type MyEnumType — это тип, а не класс. Итак, object MyEnumType не находится в неявной области.
@daharon Помогает ли импорт MyEnumType._? Если да, то работает ли он с вашими оригинальными кодеками или с моими кодеками с кавычками?
Я был неправ. Нет необходимости импортировать MyEnumType._. Имплициты можно увидеть, хотя object MyEnumType не является компаньоном. scastie.scala-lang.org/DmytroMitin/Z9CSo2UbSmKraNX8du5yZw/1 Это потому, что MyEnumType.MyEnumType есть MyEnumType.type#MyEnumType. «Части типа T: ... если T является проекцией типа S#U, части S, а также самого T;» scala-lang.org/files/archive/spec/2.13/…
Проблема заключалась в том, что по умолчанию значение перечисления генерировалось Quill как java.sql.Types.VARCHAR.
Отсюда и ошибка operator does not exist: my_enum_type = character varying, поскольку Postgres не знал, как преобразовать character varying в мой пользовательский тип Postgres enum.
Решение состояло в том, чтобы заставить Quill кодировать значение как java.sql.Types.OTHER.
object Ctx extends PostgresJdbcContext(SnakeCase)
object MyEnumType extends Enumeration {
type MyEnumType = Value
val ONE, TWO, THREE = Value
import Ctx.*
implicit val enc: Encoder[MyEnumType] = encoder(
java.sql.Types.OTHER,
(index, value, row) => row.setObject(index, value.toString, java.sql.Types.OTHER)
)
implicit val dec: Decoder[MyEnumType] =
decoder(row => index => this.withName(row.getObject(index).toString))
}
Попробовав ваше предложение, похоже, выяснилось, что Quill вообще не находит мой пользовательский кодировщик/декодер. Я не знаю, куда поместить эти значения
implicitсейчас.