[英]Add data type from PostgreSQL extension in Slick
我正在使用PostgreSQL的PostGIS擴展,我正在嘗試從表中檢索PGgeometry
對象。
這個版本工作正常:
import java.sql.DriverManager
import java.sql.Connection
import org.postgis.PGgeometry
object PostgersqlTest extends App {
val driver = "org.postgresql.Driver"
val url = "jdbc:postgresql://localhost:5432/gis"
var connection:Connection = null
try {
Class.forName(driver)
connection = DriverManager.getConnection(url)
val statement = connection.createStatement()
val resultSet = statement.executeQuery("SELECT geom FROM table;")
while ( resultSet.next() ) {
val geom = resultSet.getObject("geom").asInstanceOf[PGgeometry]
println(geom)
}
} catch {
case e: Exception => e.printStackTrace()
}
connection.close()
}
我需要能夠使用Slick自定義查詢執行相同的操作。 但是這個版本不起作用:
Q.queryNA[PGgeometry]("SELECT geom FROM table;")
並給我這個編譯錯誤
Error:(50, 40) could not find implicit value for parameter rconv: scala.slick.jdbc.GetResult[org.postgis.PGgeometry]
val query = Q.queryNA[PGgeometry](
^
有沒有一種簡單的方法在Slick中添加PGgeometry
數據類型而不必將返回的對象轉換為String並解析它?
要成功使用它,您需要定義一個GetResult
,如果要將其插入/更新到db,可能需要SetParameter
。
這是從光滑測試中提取的一些代碼(ps我假設您使用的是光滑的2.1.0):
implicit val getUserResult = GetResult(r => new User(r.<<, r.<<))
case class User(id:Int, name:String)
val userForID = Q[Int, User] + "select id, name from USERS where id = ?"
但是,如果你的java / scala類型是jts.Geometry
而不是PGgeometry
,你可以嘗試使用PGgeometry
slick-pg
,它內置支持jts.Geometry
和PostGIS
用於slick
Lifted和Plain SQL。
為了克服同樣的問題,我使用了slick slick-pg (0.8.2)
和JTS的Geometry
類作為上一個答案中提到的tminglei。 使用slick-pg
處理PostGIS的幾何類型有兩個步驟:(i)使用PgPostGISSupport
擴展Slick的PostgresDriver,以及(ii)為您的普通查詢定義隱式轉換器,如下所示。
如本頁所示,您應首先使用PgPostGISSupport擴展PostgresDriver:
object MyPostgresDriver extends PostgresDriver with PgPostGISSupport {
override lazy val Implicit = new Implicits with PostGISImplicits
override val simple = new Implicits with SimpleQL with PostGISImplicits with PostGISAssistants
val plainImplicits = new Implicits with PostGISPlainImplicits
}
使用擴展驅動程序中plainImplicits
中定義的隱式轉換,您可以將查詢編寫為:
import com.vividsolutions.jts.geom.LineString // Or any other JTS geometry types.
import MyPostgresDriver.plainImplicits._
import scala.slick.jdbc.GetResult
case class Row(id: Int, geom: LineString)
implicit val geomConverter = GetResult[Row](r => {
Row(r.nextInt, r.nextGeometry[LineString])
})
val query = Q.queryNA[Row](
"""SELECT id, geom FROM table;"""
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.