Slick count (.length / .size) 没有按预期工作

Slick count (.length / .size) doesn't work as expected

我正在使用以下 Slick 代码来实现 SQL 语句。

SQL:

SELECT device.*, COUNT(unit.id) AS cnt 
FROM device LEFT JOIN unit ON device.id = unit.device_id GROUP BY device.id;

Scala Slick:

def devicesWithUnitCount = for {
    (device, unit) <- TableQuery[TDDevice] joinLeft TableQuery[TDUnit] 
                                           on (_.id === _.deviceID) 
                                           groupBy (_._1)
} yield (device, unit.size)

示例架构,我无法让查询在那里工作,但它在我的服务器上工作。 http://sqlfiddle.com/#!9/0f335

但是,与正确返回 0 的 SQL 语句不同,即使单元中没有关联的行,灵活的实现也会产生 1 的计数。

因为我已经认为这是 SQL 语句,所以我寻求帮助 () 并被告知 SQL 语句应该可以正常工作(仔细检查并确认它有效)。现在,在那个答案的帮助下,我现在知道我的 Slick 实现肯定是错误的,我的问题是如何修复 slick 查询。

提前致谢。

请参阅 groupBy 的 Slick 文档,其中说:

a groupBy call must be followed by a map call

所以我想这对你有用:

 def devicesWithUnitCount = (
    TableQuery[TDDevice] joinLeft TableQuery[TDUnit] 
      on (_.id === _.deviceID) ) 
    .groupBy (_._1)
    .map{ case (grouped, all) => (grouped, all.map(_._2).size) }