Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 使用Play 2.3插入/更新BLOB的正确方法是什么?_Scala_Playframework 2.3_Anorm - Fatal编程技术网

Scala 使用Play 2.3插入/更新BLOB的正确方法是什么?

Scala 使用Play 2.3插入/更新BLOB的正确方法是什么?,scala,playframework-2.3,anorm,Scala,Playframework 2.3,Anorm,我管理一个具有MySQL数据库的播放服务器。它的一张桌子上有一张桌子 BLOB列。在播放2.2中,在任何显式参数值之前 由2.3引入的业务,我只需注入一个 Array[Byte]进入我的查询,如下所示: val foo: Array[Byte] = ??? // Doesn't matter. SQL("update my_table set the_blob = {foo} where id = {id}").on('foo -> foo, 'id -> id).executeU

我管理一个具有MySQL数据库的播放服务器。它的一张桌子上有一张桌子
BLOB
列。在播放2.2中,在任何显式
参数值之前
由2.3引入的业务,我只需注入一个
Array[Byte]
进入我的查询,如下所示:

val foo: Array[Byte] = ???  // Doesn't matter.
SQL("update my_table set the_blob = {foo} where id = {id}").on('foo -> foo, 'id -> id).executeUpdate()
这已经不起作用了。它将在编译时投诉:

type mismatch;                                                                  
  found   : (Symbol, Array[Byte])
  required: anorm.NamedParameter
阿诺姆似乎不知道如何转换
数组[字节]
,所以我很愚蠢 我写道:

起初我没有发现任何问题,但最终我注意到任何尝试 要使用
BLOB
写入表,需要:

  • 挂起浏览器
  • 使Play的java线程占用他们能找到的所有CPU核心
  • 永远不要完成写作
大量调试使我回到了上面的
隐式
函数。记录消息
向我展示了这个转换在一个无限循环中被反复调用

问题:如何正确地使用Anorm编写
BLOB
s

(或更一般地说)

问题:如何为 无法自动转换为
参数值


谢谢。

其他人似乎也遇到过类似的问题,特别是在查找有关如何编写这些类型映射的文档方面。在文档发现方面,我的游戏经验通常是负面的

解决方案如下所示,借用Grokbase螺纹,并为清晰起见进行了修改:

import java.sql.PreparedStatement

// Can't have top-level implicit objects, so we need a wrapper.
object foo {
  implicit object byteArrayToStatement extends ToStatement[Array[Byte]] {
    def set(s: PreparedStatement, i: Int, array: Array[Byte]): Unit = {
      s.setBlob(i, new javax.sql.rowset.serial.SerialBlob(array))
    } 
  }
}

尝试使用最新的2.3版本(2.3.8)或2.4.0-RC1,因为自2.3.0以来已添加了二进制数据转换。关于问题2,请解释如何提供自定义参数转换。您也可以使用
anorm.Object
来获取“不透明”值(不推荐)。我使用的是2.3.8,但存在上述问题。请查看
import java.sql.PreparedStatement

// Can't have top-level implicit objects, so we need a wrapper.
object foo {
  implicit object byteArrayToStatement extends ToStatement[Array[Byte]] {
    def set(s: PreparedStatement, i: Int, array: Array[Byte]): Unit = {
      s.setBlob(i, new javax.sql.rowset.serial.SerialBlob(array))
    } 
  }
}