在ZIO Quill中用>比较ZonedDateTime报错,==可正常运行
问题:Quill中使用
>运算符过滤ZonedDateTime报错,==正常 我在使用>运算符基于ZonedDateTime进行过滤时遇到错误,但==运算符可正常工作。使用的是Scala 3.2.0和Quill 4.6.0,按Quill文档说明这应该能正常运行,请问可能遗漏了什么?
代码示例
case class Post(id: Long, createdAt: ZonedDateTime) import io.getquill.* import io.getquill.extras.ZonedDateTimeOps def getUpdated(since: ZonedDateTime): Task[List[Post]] = { run { query[Post] .filter(_.createdAt > lift(since)) } .provideEnvironment(ZEnvironment(dataSource)) }
错误信息
[error] |s"==== Tree cannot be parsed to 'Ast' ==== [error] | ZonedDateTimeOps(_$7.createdAt) [error] |==== Extractors === [error] | Apply(Ident("ZonedDateTimeOps"), List(Select(Ident("_$7"), "createdAt"))) [error] |==== Stacktrace === [error] | java.base/java.lang.Thread.getStackTrace(Thread.java:1610) [error] | io.getquill.parser.engine.failParse$.apply(failParse.scala:27) [error] | io.getquill.parser.engine.failParse$.apply(failParse.scala:12) [error] | io.getquill.parser.engine.Parser.error(Parser.scala:10) [error] | io.getquill.parser.engine.Parser.error$(Parser.scala:7) [error] | io.getquill.parser.engine.ParserChain$$anon$1.error(ParserChain.scala:15) [error] | io.getquill.parser.engine.Parser.apply$$anonfun$1(Parser.scala:9) [error] | scala.Option.getOrElse(Option.scala:201) [error] | io.getquill.parser.engine.Parser.apply(Parser.scala:9) [error] | io.getquill.parser.engine.Parser.apply$(Parser.scala:7) [error] | io.getquill.parser.engine.ParserChain$$anon$1.apply(ParserChain.scala:15) [error] | io.getquill.parser.OperationsParser$$anon$20.applyOrElse(Parser.scala:889) [error] | io.getquill.parser.OperationsParser$$anon$20.applyOrElse(Parser.scala:875) [error] | scala.PartialFunction$Lifted.apply(PartialFunction.scala:313) [error] | scala.PartialFunction$Lifted.apply(PartialFunction.scala:309) [error] | io.getquill.parser.engine.ParserChain$.io$getquill$parser$engine$ParserChain$OrElse$$anon$2$$_$$anonfun$1$$anonfun$1(ParserChain.scala:43) [error] | scala.Option.orElse(Option.scala:477) [error] | io.getquill.parser.engine.ParserChain$OrElse$$anon$2.$anonfun$1(ParserChain.scala:43) [error] | scala.PartialFunction$$anonfun$fromFunction$1.applyOrElse(PartialFunction.scala:338) [error] | scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35) [error] | io.getquill.parser.engine.ParserChain$OrElse$$anon$2.$anonfun$1(ParserChain.scala:43) [error] | scala.PartialFunction$$anonfun$fromFunction$1.applyOrElse(PartialFunction.scala:338) [error] | scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35) [error] | io.getquill.parser.engine.ParserChain$OrElse$$anon$2.$anonfun$1(ParserChain.scala:43) [error] | scala.PartialFunction$$anonfun$fromFunction$1.applyOrElse(PartialFunction.scala:338) [error] | scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35) [error] | io.getquill.parser.engine.ParserChain$OrElse$$anon$2.$anonfun$1(ParserChain.scala:43) [error] | scala.PartialFunction$$anonfun$fromFunction$1.applyOrElse(PartialFunction.scala:338) [error] | scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35) [error] | io.getquill.parser.engine.ParserChain$OrElse$$anon$2.$anonfun$1(ParserChain.scala:43) [error] | scala.PartialFunction$$anonfun$fromFunction$1.applyOrElse(PartialFunction.scala:338) [error] | scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35) [error] | io.getquill.parser.engine.ParserChain$OrElse$$anon$2.$anonfun$1(ParserChain.scala:43) [error] | scala.PartialFunction$$anonfun$fromFunction$1.applyOrElse(PartialFunction.scala:338) [error] | scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35) [error] | io.getquill.parser.engine.Parser.apply(Parser.scala:9) [error] | io.getquill.parser.engine.Parser.apply$(Parser.scala:7) [error] | io.getquill.parser.engine.ParserChain$$anon$1.apply(ParserChain.scala:15) [error] | io.getquill.parser.QueryParser$$anon$13.applyOrElse(Parser.scala:540) [error] | io.getquill.parser.QueryParser$$anon$13.applyOrElse(Parser.scala:520) [error] | scala.PartialFunction$Lifted.apply(PartialFunction.scala:313) [error] | scala.PartialFunction$Lifted.apply(PartialFunction.scala:309) [error] | io.getquill.parser.engine.ParserChain$.io$getquill$parser$engine$ParserChain$OrElse$$anon$2$$_$$anonfun$1$$anonfun$1(ParserChain.scala:43) [error] | scala.Option.orElse(Option.scala:477) [error] | io.getquill.parser.engine.ParserChain$OrElse$$anon$2.$anonfun$1(ParserChain.scala:43) [error] | scala.PartialFunction$$anonfun$fromFunction$1.applyOrElse(PartialFunction.scala:338) [error] | scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35) [error] | io.getquill.parser.engine.ParserChain$OrElse$$anon$2.$anonfun$1(ParserChain.scala:43) [error] | scala.PartialFunction$$anonfun$fromFunction$1.applyOrElse(PartialFunction.scala:338) [error] | scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35)
可能的原因及解决办法
修正导入方式:
ZonedDateTimeOps的隐式扩展需要导入内部成员才能生效,把导入语句改成:import io.getquill.extras.ZonedDateTimeOps._这样Quill就能识别
>对应的AST转换逻辑。版本适配检查:Quill 4.6.0和Scala 3.2.0的组合可能存在隐式解析的兼容性问题,尝试升级Quill到最新稳定版,或者确认是否有针对Scala 3的适配补丁。
使用infix语法兜底:如果隐式扩展还是不生效,直接用infix手动构造比较逻辑:
query[Post] .filter(post => infix"${post.createdAt} > ${lift(since)}".as[Boolean])这种方式直接生成对应的SQL,绕过隐式解析环节。
检查数据库驱动支持:确认所用数据库驱动支持
ZonedDateTime的比较操作,部分驱动需要额外配置类型映射,比如为ZonedDateTime注册JDBC转换器。
内容的提问来源于stack exchange,提问作者TheKojuEffect
相关产品推荐
相关产品推荐

