我正在尝试使用否定的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)).listQuery(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),这没有多大意义。

10-07 16:13