如何使用PGpoint使用PostgreSQL进行地理定位?

如何使用PGpoint使用PostgreSQL进行地理定位?,postgresql,hibernate,spring-boot,jpa,Postgresql,Hibernate,Spring Boot,Jpa,我发现了很多建议在Hibernate中使用空间数据的答案,但我想知道这是否是最好的,因为我发现PostgreSQL与PGpoint一起用于地理定位。我实现了,但它不起作用,因为它不保存 错误:“位置”列的类型为point,但表达式的类型为character Variable 我有同样的问题,但没有人回答他。所以,如果没有人知道这个问题,让我在下面补充另一个问题 作为建议,我想知道在Spring引导上下文中使用地理数据的最佳方式是什么 谢谢!祝您愉快。没有办法直接保存/更新/获取/PGpoint对

我发现了很多建议在Hibernate中使用空间数据的答案,但我想知道这是否是最好的,因为我发现PostgreSQL与PGpoint一起用于地理定位。我实现了,但它不起作用,因为它不保存

错误:“位置”列的类型为point,但表达式的类型为character Variable

我有同样的问题,但没有人回答他。所以,如果没有人知道这个问题,让我在下面补充另一个问题

作为建议,我想知道在Spring引导上下文中使用地理数据的最佳方式是什么


谢谢!祝您愉快。

没有办法直接保存/更新/获取/PGpoint对象, 然后您必须创建自己的用户类型以支持PGpoint,以便对其进行转换。在保存之前,UserType是Hibernate的一个类,它允许创建自定义类型,以便在保存到数据库之前对其进行转换。 以下是您需要实现的代码:

首先:需要创建一个实现UserType的类:


亲切问候。

一切取决于您是否被限制冬眠。我使用DataNucleus,它支持PostGIS类型,没有问题。这个答案太棒了!我看了很多,目前它可以保存、更新和获取。非常感谢。
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(name = "type", typeClass = PGPointType.class)
  @Entity
  public class Entity {

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

       // Getters and setters 

  }