4

我使用 slick 2.0.2,我只想做一个简单的过滤器或使用 where 子语句,我只想在过滤器中执行“and”、“or”和“not”之类的逻辑操作:

val subjectdata = TableQuery[SubjectTable]
...
subjectdata.where(i=>(i.id===id && i.userId===rs.user.get.identityId.userId)).list()

并得到错误:

[error] G:\testprojects\slickplay\app\controllers\ShopController.scala:89: Cannot perform option-mapped operation
[error]       with type: (Long, String) => R
[error]   for base type: (Long, Long) => Boolean
[error]     subjectdata.where(i=>(i.id===id && i.userId===rs.user.get.identityId
.userId)).list()
[error]
                           ^

在光滑的 1.0.1 中,我可以这样做:

val results = Query(TableClass)
.filter(r => r.isNull || r.expires > new Timestamp(DateTime.now().getMillis()))
.list

我想在 Slick2 中的 TableQuery 上做类似的事情。怎么做?

4

1 回答 1

10

要知道的一件事是,Slick 的操作对类型的要求比 Scala 的更严格。两个操作数必须具有相同的基本类型,可以选择包装在选项中。因此,将 Double 与 Double 或 Option[Double] 进行比较是可以的,但将其与 Int 进行比较会给您这样的编译时警告。错误消息提示您解决问题

[error] G:\testprojects\slickplay\app\controllers\ShopController.scala:89: Cannot perform option-mapped operation
[error]       with type: (Long, String) => R
[error]   for base type: (Long, Long) => Boolean
[error]     subjectdata.where(i=>(i.id===id && i.userId===rs.user.get.identityId
.userId)).list()

(Long, String) => R您看到参数没有匹配的类型并且无法确定返回类型。所以我假设id或者rs.user.get.identityId是一个字符串。转为Intusing .toInt。或者,您可以使用.asColumnOf[String].

于 2014-05-27T00:13:30.683 回答