有一个表格,其中uuid
在Postgres DB(9.3)中是可为空的列。光滑版本是2.1.0
我们在查询
上有这个过滤器:uuid
formDefinitionId
其中table.filter(_.formDefinitionId === request.formDefinitionId)
只是一个Scala request.formDefinitionId
,request
为case class
formDefinitionId
现在当Option[Int]
case class Request(formDefinitionId : Option[Int])
光滑时会生成以下查询
request.formDefinitionId
VS
None
解决方法是根据(x2."form_definition_id" = null)
e.g。
(x2."form_definition_id” IS NULL) - this is what Postgres expects
然而,为request.formDefinitionId
的每个属性创建这样的条件是不可行的 - 在许多表中存在许多request.formDefinitionId match {
case Some(fid) => table.filter(_.formDefinitionId === fid)
case None => table.filter(_.formDefinitionId.isNull)
}
属性。是否有更好/通用的方法来实现这一目标?我想这是人们使用Slick
答案 0 :(得分:0)
没有测试(我这里没有Slick设置)。
但由于= null
没有返回任何内容,不应该像这样的工作吗?
table.filter(r => r.formDefinitionId.isNull || r.formDefinitionId === fid)
答案 1 :(得分:0)
您可以对Slick 3.3.x使用以下解决方案:
table
// case 1: both are empty
.filterIf(request.formDefinitionId.isEmpty)(_.formDefinitionId.isEmpty)
// case 2: both are defined and equal
.filterOpt(request.formDefinitionId)(_.formDefinitionId === _)
情况1对应以下SQL:
select * from table1 when form_definition_id is null;
情况2:
select * from table1 when form_definition_id = ?;
答案 2 :(得分:-1)
我是一个更新的光滑,现在也混淆了这个问题。也许它对你来说太过分了。我想用不同的列进行一些搜索(Option [text])。这是我的代码,对我有用。
val someone1 = cou.filter(_.id === id_S)
val someone2 = cou.filter(_.first_name === first)
val someone3 = cou.filter(_.last_name === last)
val someone = (someone1) union (someone2) union (someone3)
dbConfig.db.run(someone.result).map(_.toList)