Squeryl 带postgres后端的Squiryl geo查询?
如何使用带有postgres后端的Squiryl执行地理查询?我想运行的查询类型是“返回x公里内的所有用户”,等等 如果不直接/通过插件支持地理查询,如何运行原始SQL查询?我看到一个要点,看起来很复杂 更新 具体而言,我希望运行以下查询:Squeryl 带postgres后端的Squiryl geo查询?,squeryl,Squeryl,如何使用带有postgres后端的Squiryl执行地理查询?我想运行的查询类型是“返回x公里内的所有用户”,等等 如果不直接/通过插件支持地理查询,如何运行原始SQL查询?我看到一个要点,看起来很复杂 更新 具体而言,我希望运行以下查询: SELECT events.id, events.name FROM events WHERE earth_box( {current_user_lat}, {current_user_lng}, {radius_in_metres}) @>
SELECT events.id, events.name FROM events
WHERE earth_box( {current_user_lat}, {current_user_lng},
{radius_in_metres}) @> ll_to_earth(events.lat, events.lng);
这是取自此对象应能解决您的问题
object object RawSql {
def q(query: String, args: Any*) =
new RawTupleQuery(query, args)
class RawTupleQuery(query: String, args: Seq[Any]) {
private def prep = {
val s = Session.currentSession
val st = s.connection.prepareStatement(query)
def unwrap(o: Any) = o match {
case None => null
case Some(ob) => ob.asInstanceOf[AnyRef]
case null => null
case a@AnyRef => a
case a@_ => a
}
for(z <- args.zipWithIndex) {
st.setObject(z._2 + 1, unwrap(z._1))
}
st
}
def toSeq[A1]()(implicit f1 : TypedExpressionFactory[A1,_]) = {
val st = prep
val rs = st.executeQuery
try {
val ab = new ArrayBuffer[A1]
val m1 = f1.thisMapper.asInstanceOf[PrimitiveJdbcMapper[A1]]
while(rs.next)
ab.append(m1.convertFromJdbc(m1.extractNativeJdbcValue(rs, 1)))
ab
}
finally {
rs.close()
st.close()
}
}
def toTupleSeq[A1,A2]()(implicit f1 : TypedExpressionFactory[A1,_], f2 : TypedExpressionFactory[A2,_]) = {
val st = prep
val rs = st.executeQuery
try {
val ab = new ArrayBuffer[(A1,A2)]
val m1 = f1.thisMapper.asInstanceOf[PrimitiveJdbcMapper[A1]]
val m2 = f2.thisMapper.asInstanceOf[PrimitiveJdbcMapper[A2]]
while(rs.next)
ab.append(
(m1.convertFromJdbc(m1.extractNativeJdbcValue(rs, 1)),
m2.convertFromJdbc(m2.extractNativeJdbcValue(rs, 2))))
ab
}
finally {
rs.close()
st.close()
}
}
}
}
对象RawSql{
def q(查询:字符串,参数:任意*)=
新的RawTupleQuery(查询,参数)
类RawTupleQuery(查询:字符串,参数:Seq[Any]){
专用def准备={
val s=Session.currentSession
val st=s.connection.prepareStatement(查询)
def展开(o:Any)=o匹配{
case None=>null
案例部分(ob)=>ob.asInstanceOf[AnyRef]
大小写null=>null
案例a@AnyRef=>a
案例a@_=>a
}
例如(z Squeryl是“用于与数据库对话的Scala ORM和DSL”。您希望将哪个SQL查询转换为squeryl语句?我想给出的提示是:如果数据库无法解决您的问题,那么squeryl也无法解决这些问题。@VasyaNovikov我已用我要执行的特定查询更新了我的问题。然后,您的问题似乎是关于使用自定义函数的我从来没有用过这个,但似乎Squiryl有一段关于这个的话:也许会有帮助。如果没有,也许你应该提出一个单独的问题(人们可能跳过了这个问题,不理解“地理”目标).好的,谢谢。那个自定义函数页面看起来很相关。我还没有测试过这个。我想我会用doobie来代替它,因为它捆绑了对postgis的支持。