2017-12-06 11 views
0

Slickを使ってMyISAMエンジンを使ってレガシーMySQLデータベースを分析しています。また、エンティティをナビゲートするために暗黙のクラスを使用しています。このコードでuser.logsSlick:Rep [Option [Blob]]とRep [Int]を比較する

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

はどうなりますか...

は、代わりに私はまた、元val userIdでのデータ型を置き換えることができたが、その後、私はまた、すべてのLog.*Log.?のような場所の上にそのデータ型を変更する必要があります'Int'に? –

+0

@bobあなたが何を意味するか分かりません。しかし、私はデータベースを変更することはできません。それはまだ使用中です(読み書きの両方)。 – mbee

+0

私はあなたが 'BLOB'を使うことができないことを知っていると言っているので、' BLOB'を 'Int'に変換してSlickが使用できるようにする必要があります。あなたは何をしますか? –

答えて

0

私が試してみたように、ちょうどその列のふりをすると、別のデータ型が動作します。

だから、ほかに私は

val userId_asInt: Rep[Option[Int]] = column[Option[Int]]("userId", O.Default(None)) 

を追加し、

def logs = Logs.filter(_.userId_asInt === user.id) 

これやったトリックにナビゲーションdefを変更

val userId: Rep[Option[java.sql.Blob]] = column[Option[java.sql.Blob]]("userId", O.Default(None)) 

Table[LogRow]を拡張する)クラスLogの元val

- 少なくともMySQL/MyISでAM(他のエンジンや他のDBMSでも動作するかどうかは分かりません)。あなたはBLOBを変換する際に