簡體   English   中英

Hibernate 空間查詢異常,但在 postgres 控制台中正在工作

[英]Hibernate spatial query exception, but in the postgres console is working

我正在嘗試使用 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 控制台上執行,則查詢執行時沒有任何錯誤並返回正確的值。

拜托,有人可以幫助我嗎? 謝謝。

您在 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()

我解決了這個問題,改變了查詢,為此:

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");

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

謝謝您的幫助。

我之前在 Hibernate 中看到過ARRAY 構造函數的類似問題。

替換為數組文字(以及可選的類型轉換)以使其工作。 一個簡單的字符串文字將避免通信中的各種復雜情況。

您正在使用ST_MakeLine()函數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子句中的布爾表達式。 Appending = true只是噪音。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM