2017-04-12 2 views
0

Ich habe folgende Fallklasse:des nächstgelegenen Punkt mit Slick

case class Block(
       
id: Option[Int] = None,
       
blockId: Int,
       
name: String,
       
location: Option[Point] = None,
       
geometry: Option[Geometry] = None,
           
) 

In Postgres habe ich eine Tabelle Subblock contient id: int, block_id: Int, name: String, geom_location: Geographie, sub_block_geom: Geographie

Und ich definiere eine Funktion ein Subblock nächste von einem bestimmten Punkt zurückzukehren

override def getNearestSubBlock(point: Point): Future[SubBlock] = {
  
val query = sql"""SELECT sub_block_id,block_id,name,ST_AsText(geom_location),sub_block_geom from now.sub_block order by ST_Distance(geom_location, ST_MakePoint(${point.getX()}, ${point.getY()})::geography) limit 1""".as[SubBlock].head
  
db.run(query)
  
} 

implicit val getSubBlock = GetResult(r => SubBlock(r.nextIntOption(), r.nextInt(), r.nextString(), Option(Location.location2Point(Location.fromWKT(r.nextString()))), Option(new WKTReader().read(r.nextString()))) 

Und meine Anfrage gibt das richtige Ergebnis zurück, aber nachdem ich "Ausnahme im Thread" main "java.lang.NullPointerException" bekam, weil der sub_block_geom in meiner Datenbank null ist, so denke ich, dass die Lösung implizit val getSubBlock oder ändern soll Abfrage schreiben mit Filter, sortedBy, ... und ich weiß nicht, wie man das macht

+0

Nun ... das Ding ist t = Ihre Frage ist so ziemlich unantastbar, wie es jetzt ist. Die hier benötigten Informationen sind - was ist Ihre 'SubBlock' Klasse ?, Was ist Ihre genaue Fehler Stack Trace? –

+0

Die Lösung besteht nur darin, die Möglichkeit von 'null' in Ihrem' getSubBlock' angemessen zu behandeln. –

Antwort

0

Nun ... Ich bin mir nicht sicher über Ihr Problem, da viele erforderliche Details fehlen. Aber von dem, was ich sehen kann, müssen Sie einfach die Möglichkeit von null in Ihrem getSubBlock richtig handhaben.

implicit val getSubBlock = GetResult(r => { 
    val id = r.nextIntOption() 
    val blockId = r.nextInt() 
    val location: Option[Point] = r.nextStringOption().map(s => Location.location2Point(Location.fromWKT(s))) 
    val geometry: Option[Geometry] = r.nextStringOption().map(s => new WKTReader().read(s))) 

    SubBlock(id, blockId, location, geometry) 
} 
+0

danke, Ihre Lösung löst mein Problem – Salma