PostgreSQL / PostGIS хранимая функция + проблема с конвертером Eclipselink - PullRequest
0 голосов
/ 08 февраля 2011

Я использую PostgreSQL с PostGIS и Eclipselink. В базе данных Postgres у меня есть некоторые сохраненные функции, поскольку я знаю, что с сохраненными функциями Postgres + Eclipselink не работает аннотации @NamedStoredProcedureQuery, методы StoredProcedureCall и StoredFunctionCall, поэтому я использую @NamedNativeQuery. Я написал GeometryConverter, который отлично работает, когда я сохраняю

em.persist(e);

моя сущность, а с

@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.MultiLineString в org.postgis.PGgeometry. Что мне установить для работы моего конвертера?

Спасибо за вашу помощь! Тамас J

1 Ответ

1 голос
/ 08 февраля 2011

Конвертер может использоваться только в отображении для преобразования данных.У вашего нативного запроса просто есть аргумент без информации о наборе, поэтому EclipseLink не знает, как его преобразовать.

Вместо этого вы можете определить StructConverter, он всегда будет преобразовывать тип.Вот как EclipseLink поддерживает пространственные типы Oracle, поэтому в PostGIS он должен работать и в других случаях.

В противном случае вы можете попробовать выполнить собственный запрос со значением PGgeometry вместо класса Geometry.Вы также можете попробовать использовать DataReadQuery напрямую, что позволит вам напрямую установить тип аргумента.

...