我正在尝试使用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控制台上获得相同的查询并执行,则执行查询时不会出现任何错误并返回正确的值。
拜托,有人可以帮帮我吗? 感谢。
答案 0 :(得分: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;");
如果要创建db本机查询而不是HQL,请使用 createSQLQuery()而不是 createQuery()。
答案 1 :(得分: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");
我不知道为什么,但它确实有效。
感谢您的帮助。
答案 2 :(得分:0)
我之前在Hibernate中看到过与ARRAY constructors类似的问题。
替换为数组文字(以及可选的类型转换)以使其有效。一个简单的string literal将避免沟通中的各种复杂情况。
您正在使用PostGis function 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)");
这也可以解释为什么your alternative answer提供一个线串(作为字符串文字!)也是如此。
还简化了WHERE
子句like I commented中的布尔表达式。追加= true
只是噪音。