scala - Scala Slick 查询中表格元素的子类型

标签 scala slick

我正在尝试修改用于 Scala Slick 数据库查询的特征。到目前为止,这是我拥有的两种方法:

protected def findByPrimaryKey(id: PrimaryKeyType): Query[Table[_], T, Seq]

/**
 * return the row that corresponds with this record
 * @param t - the row to find
 * @return query - the sql query to find this record
 */

protected def find(t: T): Query[Table[_], T, Seq]

我想修改这两个方法签名以允许 T 的子类型.例如,如果我有一个记录的特征定义,但需要该特征的具体实现才能实际用于 slick。我试过做这样的事情:
/**
 * return all rows that have a certain primary key
 * @param id
 * @return Query object corresponding to the selected rows
 */
protected def findByPrimaryKey(id: PrimaryKeyType): Query[Table[_], _ <: T, Seq]

/**
 * return the row that corresponds with this record
 * @param t - the row to find
 * @return query - the sql query to find this record
 */

protected def find(t: T): Query[Table[_], _ <: T, Seq]

但是我收到如下编译错误:
[error]  found   : slick.driver.PostgresDriver.simple.Query[slick.driver.PostgresDriver.simple.Table[_],_$8,Seq] where type _$8 <: T
[error]     (which expands to)  scala.slick.lifted.Query[slick.driver.PostgresDriver.Table[_],_$8,Seq]
[error]  required: slick.driver.PostgresDriver.simple.Query[slick.driver.PostgresDriver.simple.Table[_],T,Seq]
[error]     (which expands to)  scala.slick.lifted.Query[slick.driver.PostgresDriver.Table[_],T,Seq]
[error] Note: _$8 <: T, but class Query is invariant in type U.
[error] You may wish to investigate a wildcard type such as `_ <: T`. (SLS 3.2.10)
[error]         val query: Query[Table[_], T, Seq] = find(t)
[error]                                                  ^
[error] /home/chris/dev/suredbits-core/src/main/scala/com/suredbits/core/db/CRUDActor.scala:58: type mismatch;
[error]  found   : slick.driver.PostgresDriver.simple.Query[slick.driver.PostgresDriver.simple.Table[_],_$8,Seq] where type _$8 <: T
[error]     (which expands to)  scala.slick.lifted.Query[slick.driver.PostgresDriver.Table[_],_$8,Seq]
[error]  required: slick.driver.PostgresDriver.simple.Query[slick.driver.PostgresDriver.simple.Table[_],T,Seq]
[error]     (which expands to)  scala.slick.lifted.Query[slick.driver.PostgresDriver.Table[_],T,Seq]
[error] Note: _$8 <: T, but class Query is invariant in type U.
[error] You may wish to investigate a wildcard type such as `_ <: T`. (SLS 3.2.10)
[error]         val query: Query[Table[_], T, Seq] = find(t)
[error]                                                  ^

我不确定该怎么做才能得到我想要的结果。

最佳答案

理想情况下,您应该使用 T 制作 Query 变体。但由于这超出了您的控制,您可以这样做(它应该可以工作):

protected def find[U <: T](t: U): Query[Table[_], U, Seq]

但我感觉你在这里处理一个更大的问题。为什么需要这样的抽象?你的类(class)设计是什么?

关于scala - Scala Slick 查询中表格元素的子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32104260/

相关文章:

scala - 如果在 Slick 3.0.0 中不存在则插入以进行批量插入

mysql - PlayFramework Slick NoSuchMethodError

scala - 在 Play Slick 中分配动态注入(inject)的数据库名称

java - 在 Scala 中创建具有任意类型和映射的三维数组

generics - 返回两个值中的第一个的通用方法

java - 在 Gradle 构建中兼顾 Scala、Antlr 和 Java

scala - 已经配置了与 play.api.db.DBApi 的绑定(bind),play-slick 的演变和注入(inject)器错误

mysql - 如何在 Slick 中使用 react 流来插入数据

scala play twitter api oauth 身份验证不起作用

file - scala.io和Scala 2.9的简单IO指南?