0

PostGISとEclipselinkでPostgreSQLを使用しています。 Postgresデータベースには、Postgresストアド関数で知っているように、ストアド関数がいくつかあります.Eclipselinkは@NamedStoredProcedureQueryアノテーション、StoredProcedureCall、およびStoredFunctionCallメソッドを使用できません。したがって、@ NamedNativeQueryを使用します。 私はPostgreSQL/PostGISストアドファンクション+ Eclipselinkコンバータの問題

em.persist(e);

私のエンティティを永続化するとき正常に動作GeometryConverterを、書いて、ここで

@NamedNativeQuery(name = "getEntity", query = "SELECT * FROM GET_ENTITY(?)", resultClass = Entity.class)

では私のGeometryConverterです:


public Geometry convertDataValueToObjectValue(Object dataValue, Session session) { 
     if (dataValue == null) { 
      return null; 
     } else if (dataValue instanceof PGgeometry) { 
      return ((PGgeometry) dataValue).getGeometry(); 
     } else { 
      log.severe("dataValue not instance of PGgeometry"); 
      return null; 
     } 
    } 

    @Override 
    public PGgeometry convertObjectValueToDataValue(Object objectValue, Session session) { 
     if (objectValue == null) { 
      return null; 
//  } else if (objectValue instanceof Geometry) { 
//   return new PGgeometry((Geometry)objectValue); 
     } else if (objectValue instanceof Point) { 
      return new PGgeometry((Point)objectValue); 
     } else if (objectValue instanceof MultiPoint) { 
      return new PGgeometry((MultiPoint)objectValue); 
     } else if (objectValue instanceof LineString) { 
      return new PGgeometry((LineString)objectValue); 
     } else if (objectValue instanceof MultiLineString) { 
      return new PGgeometry((MultiLineString)objectValue); 
     } else if (objectValue instanceof Polygon) { 
      return new PGgeometry((Polygon)objectValue); 
     } else if (objectValue instanceof MultiPolygon) { 
      return new PGgeometry((MultiPolygon)objectValue); 
     } else if (objectValue instanceof GeometryCollection) { 
      return new PGgeometry((GeometryCollection)objectValue); 
     } else { 
      log.severe("objectValue not instance of Geometry"); 
      return new PGgeometry(); 
     } 
    } 

    @Override 
    public void initialize(DatabaseMapping dm, Session session) { 
     dm.getField().setSqlType(java.sql.Types.OTHER); 
    } 

しかし、私はこれを使用したいですストアドファンクション


@NamedNativeQuery(name = "getEntityGeom", query = "SELECT * FROM GET_ENTITY_GEOM(?)") 

?パラメータは、PostGISの/ Postgresqlのgeometryタイプで、それは次の例外がスローされます。

Internal Exception: org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of org.postgis.MultiLineString. Use setObject() with an explicit Types value to specify the type to use.

私はコンバータはorg.postgis.PGgeometryにorg.postgis.MultiLineStringを変換していないことがわかります。私はコンバータを動作させるために何を設定すべきですか?

ありがとうございました! Tamas J

答えて

1

コンバータは、データを変換するためのマッピングでのみ使用できます。あなたのネイティブクエリーは、型情報を持たない引数を持つだけなので、それを変換する方法はEclipseLinkには分かりません。

代わりにStructConverterを定義することができます。これは、常に型を変換します。これがEclipseLinkがOracleの空間型をサポートする方法です。そのため、PostGISでも同様の作業が必要です。

そうしないと、Geometryクラスの代わりにPGgeometry値を使用してネイティブクエリを実行できます。 DataReadQueryを直接使用することもできます。これにより、引数タイプを直接設定できるようになります。

+0

ありがとうございました! StructConverterとDataReadQueryが動作しないか、何か間違っていますが、幾何学の代わりにPGgeometryを使用すると動作します。 –

関連する問題