这是一段使我能够以几何作为输入运行postgis &&的代码
private class WithinOp(val expr1: Expression<*>, val geom: PGgeometry) : Op<Boolean>() {
override fun toQueryBuilder(queryBuilder: QueryBuilder) {
expr1.toQueryBuilder(queryBuilder)
queryBuilder.args
queryBuilder.append(" && \'${geom.value}\'")
}查询的外观:SELECT * FROM table WHERE table."location" && 'SRID=4326;POLYGON((1 2,2 2,2 3,1 3,1 2))
现在,这是一个问题,因为&&是通过minimum bounding rectangle搜索的。它对我的目标来说不够精确,所以我想用更精确的postgis方法来代替它,比如ST_Intersects
但是当我更新我的构建器时,它不工作了,因为exposed错误地构建了这个查询:
private class WithinOp(val expr1: Expression<*>, val geom: PGgeometry) : Op<Boolean>() {
override fun toQueryBuilder(queryBuilder: QueryBuilder) {
expr1.toQueryBuilder(queryBuilder)
queryBuilder.args
queryBuilder.append(" ST_Intersects($expr1, \'${geom.value}\'")查询:SELECT * FROM table WHERE table."location" ST_Intersects(waycare.sql.Table.location, 'SRID=4326;POLYGON((1 2,2 2,2 3,1 3,1 2)) -不正确
正确的语法是:SELECT * FROM table WHERE ST_Intersects(table."location",'SRID=4326;POLYGON((1 2,2 2,2 3,1 3,1 2))
如何在exposed it中构建良好的扩展并没有很好的文档。但我得找个解决办法。任何帮助都是非常感谢的。
发布于 2020-12-25 19:46:32
我认为你需要在这里使用CustomFunction。我没有测试下面的代码,但它应该足以理解这个想法:
class ST_IntersectsFunction(val expr1: Expression<*>, val geom: String)
: CustomFunction<Boolean>("ST_Intersects", BooleanColumnType(), expr1, stringParam(geom.value))并使用:
table.select { ST_IntersectsFunction(table.id, geom) eq true }https://stackoverflow.com/questions/65442236
复制相似问题