sql >> Databáze >  >> RDS >> PostgreSQL

Jak pracovat s PGpoint for Geolocation pomocí PostgreSQL?

Neexistuje žádný způsob, jak uložit/aktualizovat/získat/ Objekt PGpoint přímo, pak musíte vytvořit svůj vlastní typ uživatele pro podporu PGpoint, abyste jej mohli převést, před uložením UserType je třída Hibernate, která umožňuje vytvořit vlastní typ, abyste jej mohli převést před uložením do databáze. Zde je kód, který musíte implementovat:

Za prvé: Je třeba vytvořit třídu, která implementuje 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;
    }

}

Za druhé: Je třeba přidat do záhlaví entity @TypeDef anotaci, přidat název a PGPointType, kterým jste ji vytvořili, a do záhlaví některého pole typu PGpoint přidat anotaci @Type s názvem, který jste vytvořili :

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

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

       // Getters and setters 

  }    

S pozdravem.




  1. Oracle 11g Express Edition pro Windows 64bit?

  2. Odstraňte duplicitní řádky z malé tabulky

  3. Jak rozdělím řetězec, abych měl přístup k položce x?

  4. Získejte součet sloupce MySQL v PHP