我正在尝试使用Slick 3.2.3实现通用分组。通用分组是指将同一查询按不同的参数或参数集进行分组。
假设我有一张桌子:
class MyTable(tag: Tag) extends Table[MyEntry](tag, "my_table") {
def text1 = column[String]("text1")
def text2 = column[Option[String]]("text2")
def list = column[List[String]]("list") // I am using postgres+slick_pg
...
}
然后我有一个包含多个联接的复杂查询,我希望能够按 text1 ,( text1 , text2 ), list 等。一种方法是定义一个通用函数,该函数使用 extractor 参数执行分组:
private def getData[T](extractor: MyTable => T) = {
// supposing MyTable comes second in the list
// of joined tables in my complex query
val groupedQuery = myComplexQuery.groupedBy(x => extractor(x._2))
...
// here goes aggregation functions, mapping etc.
}
其中提取器实现之一可以定义为
val extractor: MyTable => (Rep[String], Rep[Option[String]]) = me => me.text1 -> me.text2
但是,由于 extractor 是通用的,因此 groupBy 找不到与T类型匹配的Shape,这意味着我也必须提供它。我的问题是如何精确定义此类形状? slick.lifted软件包的文档中没有示例,并且对于Query#groupBy定义(或FlatShapeLevel)中的通用类型K,T,G和P的含义也不是很清楚。如果有人至少为原始类型(String)和tuple2(例如(String,Option [String]))提供了此类提取器函数的示例,我将不胜感激。还是有一种更好的方法可以达到我所忽略的相同结果?谢谢。