PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment travailler avec PGpoint pour la géolocalisation en utilisant PostgreSQL ?

Il n'y a aucun moyen de enregistrer/mettre à jour/obtenir/ Objet PGpoint directement, Ensuite, vous devez créer votre propre type d'utilisateur pour prendre en charge PGpoint afin de le convertir, avant qu'il ne soit enregistré, UserType est une classe d'Hibernate qui permet de créer un type personnalisé afin de le convertir avant de l'enregistrer sur la base de données. Voici le code que vous devez implémenter :

Première : Besoin de créer une classe qui implémente 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;
    }

}

Deuxième : Besoin d'ajouter sur l'en-tête d'entité l'annotation @TypeDef, ajouter un nom et le PGPointType que vous l'avez créé et sur un en-tête de champ de type PGpoint, ajouter l'annotation @Type avec le nom que vous l'avez créé :

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

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

       // Getters and setters 

  }    

Cordialement.