PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie arbeite ich mit PGpoint für die Geolokalisierung mit PostgreSQL?

Es gibt keine Möglichkeit zum Speichern/Aktualisieren/Abrufen/ PGpoint-Objekt direkt, dann müssen Sie Ihren eigenen Benutzertyp zur Unterstützung von PGpoint erstellen, um ihn zu konvertieren, bevor dieser gespeichert wird. UserType ist eine Klasse von Hibernate, die es ermöglicht, einen benutzerdefinierten Typ zu erstellen, um ihn vor dem Speichern in der Datenbank zu konvertieren. Hier ist Code, den Sie implementieren müssen:

Erstens: Es muss eine Klasse erstellt werden, die UserType implementiert :

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;
    }

}

Zweitens: Sie müssen eine @TypeDef-Anmerkung für den Entitätsheader hinzufügen, einen Namen und den PGPointType hinzufügen, den Sie erstellt haben, und für einige Feldheader des Typs PGpoint eine @Type-Anmerkung mit dem Namen hinzufügen, den Sie erstellt haben :

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

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

       // Getters and setters 

  }    

Mit freundlichen Grüßen.