sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur arbetar man med PGpoint för geolokalisering med PostgreSQL?

Det finns inget sätt att spara/uppdatera/skaffa/ PGpoint-objekt direkt, Sedan måste du skapa din egen användartyp för att stödja PGpoint för att konvertera det, innan detta sparas är UserType en klass av Hibernate som gör det möjligt att skapa anpassad typ för att konvertera den innan för att spara i databasen. Här är kod som du behöver implementera:

Först: Behöver skapa en klass som implementerar 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;
    }

}

Andra: Behöver lägga till en entitetsrubrik @TypeDef-anteckning, lägg till ett namn och PGPointType som du skapade den och på någon fältrubrik av typen PGpoint, lägg till @Type-anteckning med namnet som du skapade den :

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

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

       // Getters and setters 

  }    

Med vänlig hälsning.




  1. 7 sätt att hitta dubbletter av rader i SQL Server samtidigt som du ignorerar en primärnyckel

  2. Användning av Sqlite Stored Procedur i Android

  3. Skapa en tabell i SQL Server (T-SQL)

  4. TO_YMINTERVAL() Funktion i Oracle