Slick:将Rep [Option [Blob]]与Rep [Int]

时间:2017-12-06 15:22:02

标签: scala slick

我正在使用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]

知道如何解决这个问题吗?

1 个答案:

答案 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.?等地方更改该数据类型。