You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:15:33