Query 或 DBIOAction 的通用类型

Common type for Query or DBIOAction

我正在尝试将查询或操作作为参数传递给方法。原因是我想 运行 对同一 table.

上不同查询的结果执行相同的操作

例如:

val query1 = listItems   
val query2 = listItems.filter { x => x.id===1 }

还有我的方法:

private def findListItems(query: Query[???]): Future[Foo] = {  ... }

原来我不能只传递 query1 或 query2,因为它们有不同的类型(这是我的 ide 自动完成的):

val query1: TableQuery[ListItems] = listItems
val query2: Query[ListItems, ListItems.TableElementType, Seq] = listItems.filter(_.listId===1)

此外 ListItems.TableElementType 中的 ListItems 导致编译器错误:"not found: value ListItems".

我也试过通过action而不是query,看看我是不是运气比较好,但事实并非如此。类型相同但 ListItems.TableElementType 仍然显示错误 "not found: value ListItems".

val action1: DBIOAction[Seq[ListItems.TableElementType], ListItems.TableElementType, Effect.Read] = query1.result 
val action2: DBIOAction[Seq[ListItems.TableElementType], ListItems.TableElementType, Effect.Read] = query2.result

如何将这些查询或操作作为参数传递给通用方法?

没有 table 定义有点困难,但我相信您可以通过将类似这样的参数类型传递给这两个查询:

private def findListItems(query: Query[ListItems, _, Seq]): Future[Foo] = {  ... }

那里的 _ 应该可以工作,但是您可以通过使用 table 的正确类型(即您在扩展时传递给 Table 构造函数的类型来使其明确它在你的定义中)。

您可以使用 DBIO 实现相同的效果,只需使用 DBIO[YourType] 作为参数类型(再次 YourType 是您在 table 定义中映射的类型)。