, ben şu tanımı için, Seçenek [Blob] ile olan Scala türünü değiştirmeniz önerilir:
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])
Bir çiğ kullanabilirsiniz, null Blob değeri tercih, ama o zaman aslında (bir özel durum atma yerine) bunun dışında boş değer elde etmek sütun üzerinde OrElse (null) kullanmanız gerekiyorsa: a Şimdi
def * = id ~ extInfo.orElse(null) <> (Test, Test.unapply _)
ctual BLOB kullanımı. Okuma düz ileri: Sadece
Query(TestTable) foreach { t =>
println("mid=" + t.id + ", mbody = " +
Option(t.extInfo).map { b => b.getBytes(1, b.length.toInt).mkString })
}
takmadan veya güncelleme veri istiyorsanız
, kendi BLOB'ları oluşturmak için gereken JDBC sürücüsü tarafından uygulanan sonucu, ör .: bir Blob nesnesi olsun.
import javax.sql.rowset.serial.SerialBlob
TestTable insert Test(1, null)
TestTable insert Test(2, new SerialBlob(Array[Byte](1,2,3)))
Edit: Tek başına Blob nesnesi için uygun bir uygulama JDBC en RowSet özelliği tarafından sağlanmaktadır Ve burada (kimin BLOB'lar henüz ScalaQuery tarafından desteklenmez) Postgres için TypeMapper [Dizi [Bayt]] var:
örneğin, daha sonra
object PostgresByteArrayTypeMapper extends
BaseTypeMapper[Array[Byte]] with TypeMapperDelegate[Array[Byte]] {
def apply(p: org.scalaquery.ql.basic.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.nextBytes()
}
def updateValue(v: Array[Byte], r: PositionedResult) {
r.updateBytes(v)
}
override def valueToSQLLiteral(value: Array[Byte]) =
throw new org.scalaquery.SQueryException("Cannot convert BYTEA to literal")
}
ve kullanım:
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")
}
teşekkürler @Craig gramer hatasını düzeltmeye yardımcı olur, ingilizcem iyi değil, tekrar teşekkürler. –