我找到了很多建议在Hibernatespatial data geolocation中使用空间数据的答案,但我想知道这是否是最好的,因为我发现PostgreSQL可以与PGpoint一起用于地理定位。我实现了,但它不起作用,因为不节省。
错误:“location”列的类型为point,但表达式的类型为character variance
我也一样,但没人回答他。如果没人知道这个问题,我在下面再加一个问题。
作为建议,我想知道在Spring Boot上下文中使用Geo数据的最佳方法是什么
谢谢!祝您今天过得愉快。

最佳答案

无法直接保存/更新/获取/PGpoint对象,
然后,您必须创建自己的用户类型来支持PGpoint才能将其转换,在保存之前,user type是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 annotation,添加一个名称和创建它的PGpoint type,并在PGpoint类型的某个字段头上添加具有创建它的名称的@type annotation:
  @TypeDef(name = "type", typeClass = PGPointType.class)
  @Entity
  public class Entity {

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

       // Getters and setters

  }

谨致问候。

关于postgresql - 如何使用PostgreSQL与PGpoint进行地理定位?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53548731/

10-11 02:25