Scala 使用Play 2.3插入/更新BLOB的正确方法是什么?
我管理一个具有MySQL数据库的播放服务器。它的一张桌子上有一张桌子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
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))
}
}
}