2014-03-05 38 views
6
import scala.slick.driver.MySQLDriver.simple._ 

class RichTable[T](tag: Tag, name: String) extends Table[T](tag, name) { 

    case class QueryExt[B](q: Query[RichTable.this.type, B]) { 
    def whereEq[C](col: RichTable.this.type => Column[C], c: C) = { 
     q.filter { fields => 
     col(fields) === c 
     } 
    } 
    } 

} 

然後抱怨光滑2.0定義一般`通過field`方法找到

[error] /home/jilen/workspace/play-slick/src/main/scala/play/slick/SlickQueryExtension.scala:10: value === is not a member of slick.driver.MySQLDriver.simple.Column[C] 
[error]   col(fields) === c 
[error]     ^
[error] /home/jilen/workspace/play-slick/src/main/scala/play/slick/SlickQueryExtension.scala:9: ambiguous implicit values: 
[error] both value BooleanColumnCanBeQueryCondition in object CanBeQueryCondition of type => scala.slick.lifted.CanBeQueryCondition[scala.slick.lifted.Column[Boolean]] 
[error] and value BooleanOptionColumnCanBeQueryCondition in object CanBeQueryCondition of type => scala.slick.lifted.CanBeQueryCondition[scala.slick.lifted.Column[Option[Boolean]]] 
[error] match expected type scala.slick.lifted.CanBeQueryCondition[Nothing] 
[error]  q.filter { fields => 
[error]    ^
[error] two errors found 
[error] (compile:compile) Compilation failed 
[error] Total time: 0 s, completed Mar 6, 2014 1:21:48 AM 

這個已經有問題,但答案沒有爲2.0

How to parametrize Scala Slick queries by WHERE clause conditions?

回答

7

工作Slick沒有關於C的任何信息,所以它不知道它是否可以以及如何將其映射到數據庫值,以及它是否可以使用=== 在上面。所以你得到一個類型錯誤。您將不得不使用Scala的類型系統將類型限制爲Slick知道如何映射它的類型。您可以通過提供所謂的上下文綁定來實現此目的,在此例中爲:BaseColumnType

def whereEq[C:BaseColumnType](col: RichTable.this.type => Column[C], c: C) = { 
    q.filter { fields => 
    col(fields) === c 
    } 
} 

BaseColumnType由油滑提供並以這種方式使用它主要是告訴Scala編譯器去尋找BaseColumnType[C]類型的範圍的隱含價值,其中您電話whereEq。因爲那通常知道C實際上是什麼。 Slick帶有BaseColumnType[Int],BaseColumnType[String]等,所以在呼叫站點,當你的C確實是在該特定呼叫中的IntString並且這種方式將信息進一步傳遞給Slick時,Scala編譯器可以找到一個。

劉提格爾的問題也一樣。 abstract class Crud[..., PK:BaseColumnType]應該做的伎倆,特質不適用於上下文邊界。當實現一個抽象的DAO時,準備面對很多挑戰,並且走到你的Scala類型系統技能的邊緣,並學習相當多的關於類型推斷順序,隱含參數等。

+0

如何獲得'MySQLDriver ',以便我可以將我的代碼應用於不同的驅動程序類型? – jilen

+0

您可以在網上找到大量示例。一個在我們的示例項目中:https://github.com/slick/slick-examples/blob/master/src/main/scala/com/typesafe/slick/examples/lifted/MultiDBExample.scala – cvogt

+1

這似乎不適用於選項類型。我如何定義I方法使用Option [xxx]類型? – jilen