2016-10-02 8 views
1

を働いている:休止状態空間検索の例外が、Postgresでは、コンソールは、私が休止状態と休止状態空間を使用して、私の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] 

クエリを確認したところ、エラーが見つかりませんでした。しかし、私はこの同じクエリを取得し、ポストグルコンソールで実行すると、クエリはエラーなしで実行され、正しい値を返します。

誰かが私を助けることができますか?おかげさまで

+0

これを実行している間は、クエリを簡略化します。 'ST_DWITHIN()'は既に 'boolean'を返します。 '= true'を追加する必要はありません。それはちょうどノイズです:'犯罪からの犯罪cの場所ST_DWITHIN(ST_MakeLine(ARRAY [...])、c.location、0.0001) ' –

+0

ありがとう、私はそれを変更します – brunoroberto

答えて

1

ここでは、休止状態でネイティブクエリーを使用しています。このために、あなたが以下のようにクエリを使用する必要があります。

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

使用createSQLQuery()の代わりに、からCreateQuery()、あなたが代わりにHQLのデシベルネイティブクエリを作成したい場合。

+0

私は試しましたあなたの提案が、今は他の例外が発生しています:e =(org.hibernate.MappingException)org.hibernate.MappingException:いいえJDBCの型のダイアレクトマッピング:1111。 – brunoroberto

+0

hibernateによって列型をデータベース型にマップできないという型マッピング例外です。物事を適切にマッピングできない場合は、コード全体(pojoクラス、テーブル構造、メインクラス)を追加してください。 –

+0

同じテーブルとオブジェクトを使用して別のクエリを使用するのは奇妙です。例外をスローしません。しかし、私はこの別のクエリでcreateSQLQueryの代わりにcreateQueryのみを使用していました。 – brunoroberto

0

私はこの1つのために、クエリを変更し、この問題を解決:

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

私はなぜ知らないが、それは動作します。

ありがとうございました。

0

HibernateでARRAY constructorsと同様の問題が発生しました。

PostgreSQL: Issue with passing array to procedure

それを動作させるために、配列リテラル(および必要に応じてタイプキャスト)と交換

  • 。単純なstring literalは、通信にさまざまな複雑さを避けるでしょう。

    PostGis function ST_MakeLine()の配列を入力パラメータとしてgeometryにしています。だから、

    ジオメトリST_MakeLinegeometry[] 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がラインストリングを提供する理由も説明するだろうとしてうまく機能(文字列リテラルとして!)。

    WHERElike I commentedのブール式も簡略化されています。 = trueを付けることはちょうどノイズです。