Как работать с PGpoint для геолокации с использованием PostgreSQL? - PullRequest
0 голосов
/ 30 ноября 2018

Я нашел много ответов, которые предлагают использовать пространственные данные с Hibernate пространственные данные геолокации , но я хочу знать, является ли это лучшим, потому что я обнаружил, что PostgreSQL работает с PGpoint для GeoLocation.Я реализовал, но это не работает, потому что не сохраняет.

ОШИБКА: столбец "местоположение" имеет тип точки, но выражение имеет тип символа меняется

Iесть тот же вопрос , но никто не ответил ему.Поэтому позвольте мне добавить другой вопрос ниже, если никто не знает об этом вопросе.

В качестве предложения я хотел бы знать, как лучше всего использовать гео-данные в контексте Spring Boot

Спасибо!хорошего дня.

1 Ответ

0 голосов
/ 13 декабря 2018

Нет способа сохранить / обновить / получить / объект PGpoint напрямую, затем вам нужно создать собственный тип пользователя для поддержки PGpoint, чтобы преобразовать его, до этогоUserType - это класс Hibernate, который позволяет создавать пользовательский тип для его преобразования перед сохранением в базе данных.Вот код, который вам нужно реализовать:

Первый: Необходимо создать класс, который реализует UserType :

public class PGPointType implements UserType {
    @Override
    public int[] sqlTypes() {
        return new int[]
                {
                        Types.VARCHAR
                };
    }

    @SuppressWarnings("rawtypes")
    @Override
    public Class<PGpoint> returnedClass() {
        return PGpoint.class;
    }

    @Override
    public boolean equals(Object obj, Object obj1) {
        return ObjectUtils.equals(obj, obj1);
    }

    @Override
    public int hashCode(Object obj) {
        return obj.hashCode();
    }

    @Override
    public Object nullSafeGet(ResultSet resultSet, String[] names, SharedSessionContractImplementor sharedSessionContractImplementor, Object o) throws SQLException {
        if (names.length == 1) {
            if (resultSet.wasNull() || resultSet.getObject(names[0]) == null) {
                return null;
            } else {
                return new PGpoint(resultSet.getObject(names[0]).toString());
            }
        }
        return null;
    }


    @Override
    public void nullSafeSet(PreparedStatement statement, Object value, int index, SharedSessionContractImplementor sharedSessionContractImplementor) throws SQLException {
        if (value == null) {
            statement.setNull(index, Types.OTHER);
        } else {
            statement.setObject(index, value, Types.OTHER);
        }
    }

    @Override
    public Object deepCopy(Object obj) {
        return obj;
    }

    @Override
    public boolean isMutable() {
        return Boolean.FALSE;
    }

    @Override
    public Serializable disassemble(Object obj) {
        return (Serializable) obj;
    }

    @Override
    public Object assemble(Serializable serializable, Object obj) {
        return serializable;
    }

    @Override
    public Object replace(Object obj, Object obj1, Object obj2) {
        return obj;
    }

}

Второе: Необходимо добавить к аннотации заголовка сущности @TypeDef, добавить имя и PGPointType, который вы его создали, а к заголовку какого-либо поля типа PGpoint добавить аннотацию @Type с именем, которое вы ее создали :

  @TypeDef(name = "type", typeClass = PGPointType.class)
  @Entity
  public class Entity {

       @Type(type = "type")
       private PGpoint pgPoint;

       // Getters and setters 

  }    

С уважением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...