1

我正在尝试使用 Hibernate 和 Hibernate Spatial 在我的 Java 代码中执行此查询:

Query q = s.createQuery("SELECT c FROM crimes c WHERE ST_DWITHIN(ST_MakeLine(ARRAY['SRID=4326;POINT(-49.30621000000001 -25.515020000000003)','SRID=4326;POINT(-49.30619 -25.515770000000003)','SRID=4326;POINT(-49.306180000000005 -25.5162)','SRID=4326;POINT(-49.305780000000006 -25.5162)']), c.location, 0.0001) = true;");

但是,此查询会导致异常:

e = (org.hibernate.hql.internal.ast.QuerySyntaxException) org.hibernate.hql.internal.ast.QuerySyntaxException: expecting CLOSE_BRACKET, found ',' near line 1, column 151 [SELECT c FROM com.safecity.server.db.model.EntityCrime c WHERE ST_DWITHIN(ST_MakeLine(ARRAY['SRID=4326;POINT(-49.305820000000004 -25.515330000000002)','SRID=4326;POINT(-49.306200000000004 -25.515340000000002)','SRID=4326;POINT(-49.30619 -25.515770000000003)','SRID=4326;POINT(-49.306180000000005 -25.5162)','SRID=4326;POINT(-49.305780000000006 -25.5162)']), c.location, 0.0001) = true]

我检查了查询,但找不到错误。但是,如果我得到这个相同的查询并在 postgres 控制台上执行,则该查询将在没有任何错误的情况下执行并返回正确的值。

拜托,有人可以帮助我吗?谢谢。

4

3 回答 3

1

您在 hibernate 中使用本机查询。为此,您必须使用如下查询:

Query q = s.createSQLQuery("SELECT c FROM crimes c WHERE ST_DWITHIN(ST_MakeLine(ARRAY['SRID=4326;POINT(-49.30621000000001 -25.515020000000003)','SRID=4326;POINT(-49.30619 -25.515770000000003)','SRID=4326;POINT(-49.306180000000005 -25.5162)','SRID=4326;POINT(-49.305780000000006 -25.5162)']), c.location, 0.0001) = true;");

如果要创建数据库原生查询而不是 HQL,请使用createSQLQuery()而不是createQuery() 。

于 2016-10-02T13:36:14.653 回答
0

我之前在 Hibernate中看到过与ARRAY 构造函数类似的问题。

替换为数组文字(以及可选的类型转换)以使其工作。一个简单的字符串文字将避免通信中的各种复杂情况。

您正在使用将数组作为输入参数的PostGis 函数。ST_MakeLine()geometry

几何ST_MakeLine ( geometry[] geoms_array)

所以:

Query q = s.createQuery(
  "SELECT c FROM crimes c
   WHERE  ST_DWITHIN(ST_MakeLine('{SRID=4326;POINT(-49.30621000000001 -25.515020000000003)
                                  ,SRID=4326;POINT(-49.30619 -25.515770000000003)
                                  ,SRID=4326;POINT(-49.306180000000005 -25.5162)
                                  ,SRID=4326;POINT(-49.305780000000006 -25.5162)}'::geometry[]), c.location, 0.0001)");

这也可以解释为什么提供线串(作为字符串文字!)的替代答案也有效。

还像我评论的那样简化了WHERE子句中的布尔表达式。附加只是噪音。= true

于 2016-10-02T16:42:48.830 回答
0

我解决了这个问题,改变了查询,为此:

Query q = s.createQuery("SELECT c FROM crimes c WHERE ST_DWITHIN(ST_GeomFromText('LINESTRING(-49.305820000000004 -25.515330000000002,-49.306200000000004 -25.515340000000002,-49.30619 -25.515770000000003,-49.306180000000005 -25.5162,-49.305780000000006 -25.5162)', 4326), c.location, 0.0001) = true");

我不知道为什么,但它有效。

谢谢您的帮助。

于 2016-10-02T15:53:27.820 回答