【发布时间】:2018-10-18 13:42:39
【问题描述】:
假设我在 Slick 3.2.3 中有一个这样定义的表:
class ATable(tag: Tag) extends Table[(Int, Option[Boolean])](tag, "a_table") {
def someInt = column[Int]("some_int")
def someBool = column[Option[Boolean]]("some_bool")
def * = (someInt, someBool)
}
object ATable extends TableQuery(new ATable(_))
还有一些数据:
insert into a_table
values
(1, true),
(2, null),
(2, true),
(2, null),
(3, true),
(3, true),
(3, null);
现在我想在表中找到那些整数,其中恰好有一行 some_bool 不是 null。这在 SQL 中并不难:
select some_int
from a_table
group by some_int
having count(some_bool) = 1;
这很好用。所以让我们用 Slick 试试吧:
ATable
.groupBy(_.someInt)
.filter(_._2.map(_.someBool).countDefined === 1)
.map(_._1)
当它编译时,它会在运行时崩溃并显示错误消息“slick.SlickTreeException: Cannot convert node to SQL Comprehension”。这是已知的限制还是 slick 中的错误?还是我应该以不同的方式编写查询?
当然可以用子查询来写,但我更想明白为什么groupBy这个东西不起作用……
【问题讨论】: