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

Doobie从1.0.0-RC2升级到1.0.0-RC4后fragments.or编译失败

Doobie 1.0.0-RC4中fragments.or编译错误的解决方法

Doobie从1.0.0-RC2升级到RC4后,fragments.or的方法签名确实做了调整:不再支持可变参数传入,改为直接接受Iterable[Fragment]类型的参数。你之前用的: _*列表展开语法已经不需要了,直接传入列表即可。

另外你的代码存在潜在问题:当匹配到case _时会生成空的fr"",这会导致最终组合出的SQL包含无效的OR分支(比如OR ),建议先过滤掉空片段再调用or。

修改后的代码如下:

def statusFilter(queryCriteria: QueryCriteria): Option[Fragment] =
  queryCriteria.statusFilter.map { filters =>
    val filterFragments: List[Fragment] = filters.map {
      case StatusFilter(Open, date)     => statusFilterOpen(date)
      case StatusFilter(Upcoming, date) => statusFilterUpcoming(date)
      case StatusFilter(Closed, date)   => statusFilterClosed(date)
      case _                            => fr""
    }.filterNot(_.isEmpty) // 过滤空片段,避免生成无效SQL
    
    fragments.or(filterFragments) // 直接传入列表,无需:_*展开
  }

1.0.0-RC4及以上版本的Doobie中,fragments.or和fragments.and都统一接受Iterable类型参数,这种设计更贴合Scala的集合操作习惯,也避免了可变参数带来的额外开销。

内容的提问来源于stack exchange,提问作者Tom Squires

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:57:36