Query或DBIOAction的常见类型

时间:2015-06-17 13:59:34

标签: scala slick-3.0

我试图将查询或操作作为参数传递给方法。原因是我想对同一个表上的不同查询的结果运行相同的操作。

例如:

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中的ListItem导致编译器错误:"未找到:value ListItems"。

我还尝试传递操作而不是查询,看看我是否有更多的运气,但事实并非如此。类型相同,但ListItems.TableElementType仍显示错误"未找到: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

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

1 个答案:

答案 0 :(得分:1)

没有表定义有点困难,但我相信你可以通过这样的参数类型来传递两个查询:

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

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

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