我使用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做类似的事情。怎么做?
答案 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
中,您会看到参数没有匹配的类型,并且无法确定返回类型。所以我假设id
或rs.user.get.identityId
是一个字符串。使用Int
转为.toInt
。或者,您可以使用.asColumnOf[String]
转换db-side值。