我正在使用Slick来分析遗留的MySQL数据库(使用MyISAM引擎)。我正在使用隐式类来浏览实体,例如user.logs
使用此代码:
implicit class UserNav(user: User) {
def logs = Logs.filter(_.userId === user.id)
}
但是,在这种情况下,密钥是INT,但外键是BLOB。使用MySQL客户端我可以运行select userId * 1 from logs
从BLOB获取INT,尽管数据类型不同,我甚至可以加入。但是对于Slick我得到了上面代码的编译错误。
error: Cannot perform option-mapped operation [ERROR]
with type: (Option[java.sql.Blob], Int) => R [ERROR]
for base type:(java.sql.Blob, java.sql.Blob) => Boolean
error: ambiguous implicit values:
both value BooleanOptionColumnCanBeQueryCondition in object CanBeQueryCondition of type => slick.lifted.CanBeQueryCondition[slick.lifted.Rep[Option[Boolean]]]
and value BooleanCanBeQueryCondition in object CanBeQueryCondition of type => slick.lifted.CanBeQueryCondition[Boolean]
match expected type slick.lifted.CanBeQueryCondition[Nothing]
知道如何解决这个问题吗?
答案 0 :(得分:0)
正如我通过尝试发现的那样,只是假装列有不同的数据类型。
除了课程val
中的原始Log
(扩展Table[LogRow]
)
val userId: Rep[Option[java.sql.Blob]] = column[Option[java.sql.Blob]]("userId", O.Default(None))
我添加了
val userId_asInt: Rep[Option[Int]] = column[Option[Int]]("userId", O.Default(None))
并将导航def
更改为
def logs = Logs.filter(_.userId_asInt === user.id)
这就是诀窍 - 至少使用MySQL / MyISAM(不知道这是否适用于其他引擎甚至是其他DBMS)。
相反,我也可以替换原始val userId
中的数据类型,但之后我还需要在Log.*
和Log.?
等地方更改该数据类型。