SquerylでPostgreSQLのpoint型のデータを書き込む(これは酷い)
やりたい事
他のORMと比べて便利かどうかは特に検討せずに、とりあえずSquerylを使ってる。
PostgreSQLにはgeometry関連の型があって、更に詳しく言うとPostGISとそうじゃないやつがあるんだけど、その辺の詳細は省略。今回扱うのは通常のpoint型の話。x, yの2次元の座標を扱うもの。
で、今回はその point 型の値を書き込む(その場しのぎの)方法をさらっと。
ちなみに読み込みは?
読み込みだけなら、フィールドをstringで受ければOK。
case class SomeTable ( val id: Int, @Column("location") val rawLocation: Option[String] ) extends KeyedEntity[Int] { def this() = { this(0, None) } def location: Option[Point] = { // str2point は文字列をパースして Point 型を返す関数。どっかで適当に定義する。 rawLocation map { str2point(_) } } }
書き込み・・・
PostgreSqlAdapter をオーバーライドしてしのいだ・・・
import org.postgresql.geometric.PGpoint import org.squeryl.adapters.PostgreSqlAdapter val postgreSqlAdapter = new PostgreSqlAdapter { override def convertToJdbcValue(r: AnyRef) : AnyRef = { val defval = super.convertToJdbcValue(r) if (r.isInstanceOf[String]) { // Point.apply(str: String): Option[Point] Point(r.asInstanceOf[String]) match { case Some(p) => new PGpoint(p.lat, p.lng) case None => defval } } else { defval } } }
最後に
もっと簡単な(というかちゃんとした)方法があれば教えて下さい。
時間がなくて、ちゃんとソースを読んでないので、こんな方法しか思いつかなかった。と言い訳。