2014-02-06 60 views
1

我試圖創建一個findBy方法,該方法需要一個鍵和值來搜索表。出於某種原因,以下沒有找到任何東西:使用`on`替換Scala中的佔位符SQL查詢

def findBy(key: String, value: String): Option[Authentication] = DB.withConnection { implicit connection => 
    SQL("select * from authentications where {key}='{value}' limit 1") 
    .on("key" -> key, "value" -> value).as(authentication.singleOpt) 
} 

但是,當我只是使用加號,它的確如此。我不會介意離開它這樣,但也有以能夠使用on

def findBy(key: String, value: String): Option[Authentication] = DB.withConnection { implicit connection => 
    SQL("select * from authentications where " + key + "='" + value + "' limit 1") 
    .as(authentication.singleOpt) 
} 

實例查詢的好處:Authentication.findBy("email", "[email protected]")

回答

2

播放轉義準備的SQL語句的查詢參數。所以你實際上並不需要用單引號來包裝{value}。不幸的是,這意味着列名將被引用和Play一起轉義,所以它將被數據庫解釋爲一個字符串。沒有使用字符串連接或字符串插值,我沒有看到解決這個問題的方法。字符串的開始之前

def findBy(key: String, value: String): Option[Authentication] = DB.withConnection { implicit connection => 
    SQL(s"select * from authentications where `$key` = {value} limit 1") 
     .as(authentication.singleOpt) 
     .on("value" -> value).as(authentication.singleOpt) 
} 

公告的「S」:

斯卡拉串插看起來代碼更好看一點。 scala編譯器將用範圍內的字符串key替換標記$key。這應該工作,但key不會逃脫。所以你必須自己清理輸入key,除非你只在內部使用它。此外,需要注意的是,表格中不是列的key的輸入將產生SQLException

+0

這很有趣,但是,反引號在sql中不起作用,我無法得到這種特殊的方法。我不知道我做錯了什麼。 –

+0

MySQL中的反引號對我有用,但也許你的結果可能會有所不同。 –

+0

啊我使用postgresql,非常感謝你,這是非常有幫助的。 –