PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да работя с PGpoint за геолокация, използвайки PostgreSQL?

Няма начин да запазите/актуализирате/получите/ 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 

  }    

С уважение.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да подготвим изрази и параметри за свързване в Postgresql за C++

  2. Рефакториране на външния ключ към полета

  3. Надстройка до PostgreSQL13

  4. Стойност NULL на функцията Postgres за ред, който препраща към НОВО

  5. Автоматично увеличаване на частичен първичен ключ с Entity Framework Core