我正在尝试使用否定的inSet
构建一个Slick查询,但是我在弄清楚正确的语法时遇到了麻烦。我想做类似的事情
val lst = List(1, 2, 3)
Query(Table1).where(_.id1 === 1).where(!(_.id2 inSet lst)).list
或者
Query(Table1).where(_.id1 === 1).where(isNot(_.id2 inSet lst)).list
两者都没有通过。是否可以像这样否定
inSet
,如果是,正确的语法是什么?还是有另一种方式来构造不需要否定inSet
的查询?我正在使用Slick 1.0.1,我希望我们将在下个月内升级到Slick 2.0。 (我可以将filterNot(lst.contains(_.id2))
应用于查询结果,而不是在查询中放入否定的inSet
,但这会使我正在编写的函数变得复杂,因此,如果可能的话,我宁愿使用否定的inSet
。) 最佳答案
之一Query(Table1).filter(_.id1 === 1).filter(row => !(row.id2 inSet lst)).list
Query(Table1).filter(_.id1 === 1).filterNot(_.id2 inSet lst).list
相关信息: https://github.com/slick/slick/pull/204
旁注:不推荐使用 where
。使用Scala集合术语而不是SQL术语。另外,您有一个错误的假设,即在Scala中,!(_.id2 inSet lst)
扩展为x => !(x.id2 inSet lst)
,而实际上却扩展为!(x => x.id2 inSet lst)
,这没有多大意义。