我遇到了 Slick 的文档,发现它要求def *在表定义中使用一种方法来获取映射投影。所以这条线看起来像这样
def * = (name, id.?).<>(User.tupled,User.unapply)
Run Code Online (Sandbox Code Playgroud)
我看到该<>方法是在 a 上调用的tuple- 在本例中为 a Tuple2。该方法是ShapedValue在 Slick 代码中的 case 类上定义的。如何找出进行查找的隐式方法?
这是我的进口:
import scala.concurrent.Await
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import slick.driver.H2Driver.api._
import slick.lifted.ShapedValue
import slick.lifted.ProvenShape
Run Code Online (Sandbox Code Playgroud)
所以我自己想出了一个。
该对象Shape实现了三个特征,即ConstColumnShapeImplicits,AbstractTableShapeImplicits和TupleShapeImplicits 。这三个特征处理与 Slick 中的 Shapes 相关的隐式转换。该TupleShapeImplicits房屋,一个元组转换为TupleShape所需的所有隐式转换方法。
现在(name, id.?, salary.?).<>(User.tupled,User.unapply)正在发生的事情是该方法<>具有Shape
The Shape 类的隐式参数,因此进入隐式转换的范围。也TupleShapeImplicits进入了范围。