我找到了很多建议在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/