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
相关产品推荐
相关产品推荐

