光滑过滤器或不再支持逻辑操作的地方?

时间:2014-05-26 20:42:20

标签: scala slick logical-operators slick-2.0

我使用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做类似的事情。怎么做?

1 个答案:

答案 0 :(得分:9)

要知道的是,Slick的操作对于类型比Scala更严格。两个操作数必须具有相同的基本类型,可选地包含在选项中。因此比较Double to 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中,您会看到参数没有匹配的类型,并且无法确定返回类型。所以我假设idrs.user.get.identityId是一个字符串。使用Int转为.toInt。或者,您可以使用.asColumnOf[String]转换db-side值。