Slick 3.1,左连接和过滤器
Slick 3.1, Left Joins and Filters
我有一个 Slick 查询,其中包含两个左连接(最终为 Rep[Option[...]]
)和列映射。我需要对结果进行过滤(使用 like
)。如果三列中的任何一列符合 like
条件,则必须在结果中包含一行,因此我无法预过滤表 - 我必须过滤生成的连接、Rep[Option]
s 和所有.
我不知道如何过滤 Rep[Option[String]]
列。由于 "cannot resolve symbol ||",下面的代码无法编译 - 如果在我删除 Rep[Option]
列时编译完美。
val joinedTable = Sites.map(s=>(s.id, s.gisId))
.joinLeft(SiteText.filter(_.lang==="jp").map(l=>(l.name, l.siteId))).on{ case(s,t)=>s._1===t._2 }
.joinLeft(SiteText.filter(_.lang==="en").map(l=>(l.name, l.siteId))).on{ case(st,t)=>st._1._1===t._2 }
val searchedTable = joinedTable.filter { row =>
List(
searchStr.map( t => row._1._1._2 like t ),
searchStr.map( t => row._1._2.map(_._1 like t) ),
searchStr.map( t => row._2.map(_._1 like t) )
).collect({case Some(criteria) => criteria}).reduceLeftOption(_ || _).getOrElse(true: Rep[Boolean])
}
以下似乎对我有用:
joinedTable
.filter({ case ((a, b), c) => List(
searchStr.map(t => (a._2 like t)),
searchStr.map(t => b.filter(_._1 like t).isDefined),
searchStr.map(t => c.filter(_._1 like t).isDefined)
)
.flatten
.reduceLeftOption(_ || _)
.getOrElse(false: Rep[Boolean])
})
我有一个 Slick 查询,其中包含两个左连接(最终为 Rep[Option[...]]
)和列映射。我需要对结果进行过滤(使用 like
)。如果三列中的任何一列符合 like
条件,则必须在结果中包含一行,因此我无法预过滤表 - 我必须过滤生成的连接、Rep[Option]
s 和所有.
我不知道如何过滤 Rep[Option[String]]
列。由于 "cannot resolve symbol ||",下面的代码无法编译 - 如果在我删除 Rep[Option]
列时编译完美。
val joinedTable = Sites.map(s=>(s.id, s.gisId))
.joinLeft(SiteText.filter(_.lang==="jp").map(l=>(l.name, l.siteId))).on{ case(s,t)=>s._1===t._2 }
.joinLeft(SiteText.filter(_.lang==="en").map(l=>(l.name, l.siteId))).on{ case(st,t)=>st._1._1===t._2 }
val searchedTable = joinedTable.filter { row =>
List(
searchStr.map( t => row._1._1._2 like t ),
searchStr.map( t => row._1._2.map(_._1 like t) ),
searchStr.map( t => row._2.map(_._1 like t) )
).collect({case Some(criteria) => criteria}).reduceLeftOption(_ || _).getOrElse(true: Rep[Boolean])
}
以下似乎对我有用:
joinedTable
.filter({ case ((a, b), c) => List(
searchStr.map(t => (a._2 like t)),
searchStr.map(t => b.filter(_._1 like t).isDefined),
searchStr.map(t => c.filter(_._1 like t).isDefined)
)
.flatten
.reduceLeftOption(_ || _)
.getOrElse(false: Rep[Boolean])
})