Kể từ khi lĩnh vực BLOB là nullable, tôi khuyên bạn nên thay đổi kiểu Scala của mình để lựa chọn [Blob], cho định nghĩa sau đây:
object TestTable extends Table[Test]("test") {
def id = column[Long]("mid")
def extInfo = column[Option[Blob]]("mbody")
def * = id ~ extInfo <> (Test, Test.unapply _)
}
case class Test(id: Long, extInfo: Option[Blob])
Bạn có thể sử dụng một liệu, giá trị Blob nullable nếu bạn thích, nhưng sau đó bạn cần phải sử dụng OrElse (null) trên cột để thực sự có được một giá trị null ra khỏi nó (thay vì ném một ngoại lệ):
def * = id ~ extInfo.orElse(null) <> (Test, Test.unapply _)
Bây giờ cho một CTOB xử lý BLOB. Đọc sách là thẳng về phía trước: Bạn chỉ cần có được một đối tượng Blob trong kết quả đó được thực hiện bởi các trình điều khiển JDBC, ví dụ .:
Query(TestTable) foreach { t =>
println("mid=" + t.id + ", mbody = " +
Option(t.extInfo).map { b => b.getBytes(1, b.length.toInt).mkString })
}
Nếu bạn muốn chèn hoặc cập nhật dữ liệu, bạn cần phải tạo ra các đốm màu của riêng bạn. Một thực hiện thích hợp cho một đối tượng Blob độc lập được cung cấp bởi tính năng RowSet JDBC của:
import javax.sql.rowset.serial.SerialBlob
TestTable insert Test(1, null)
TestTable insert Test(2, new SerialBlob(Array[Byte](1,2,3)))
Edit: Và đây là một TypeMapper [Array [Byte]] cho Postgres (có đốm màu chưa được hỗ trợ bởi ScalaQuery):
implicit object PostgresByteArrayTypeMapper extends
BaseTypeMapper[Array[Byte]] with TypeMapperDelegate[Array[Byte]] {
def apply(p: BasicProfile) = this
val zero = new Array[Byte](0)
val sqlType = java.sql.Types.BLOB
override val sqlTypeName = "BYTEA"
def setValue(v: Array[Byte], p: PositionedParameters) {
p.pos += 1
p.ps.setBytes(p.pos, v)
}
def setOption(v: Option[Array[Byte]], p: PositionedParameters) {
p.pos += 1
if(v eq None) p.ps.setBytes(p.pos, null) else p.ps.setBytes(p.pos, v.get)
}
def nextValue(r: PositionedResult) = {
r.pos += 1
r.rs.getBytes(r.pos)
}
def updateValue(v: Array[Byte], r: PositionedResult) {
r.pos += 1
r.rs.updateBytes(r.pos, v)
}
override def valueToSQLLiteral(value: Array[Byte]) =
throw new SQueryException("Cannot convert BYTEA to literal")
}
cảm ơn @Craig giúp sửa lỗi ngữ pháp, tiếng anh của tôi không tốt, cảm ơn lần nữa. –