如何使用 PGpoint 使用 PostgreSQL 进行地理定位?
Posted
技术标签:
【中文标题】如何使用 PGpoint 使用 PostgreSQL 进行地理定位?【英文标题】:How to work with PGpoint for Geolocation using PostgreSQL? 【发布时间】:2019-05-02 02:08:56 【问题描述】:我找到了很多建议在 Hibernate spatial data geolocation 中使用空间数据的答案,但我想知道这是否是最好的,因为我发现 PostgreSQL 与 PGpoint 一起用于 GeoLocation。我实现了,但它不起作用,因为不保存。
错误:列“位置”的类型是点,但表达式的类型是字符变化
我有同样的question,但没有人回答他。如果没有人知道这个问题,那么让我在下面添加其他问题。
作为建议,我想知道在 Spring Boot Context 上使用地理数据的最佳方式是什么
谢谢!祝你有美好的一天。
【问题讨论】:
一切都取决于您是否仅限于 Hibernate。我使用 DataNucleus,它支持 PostGIS 类型没有问题 【参考方案1】:没有办法直接保存/更新/获取/ PGpoint对象, 然后您必须创建自己的用户类型以支持 PGpoint 才能转换它,在保存之前,UserType 是 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注解,添加一个名称和你创建它的PGPointType,在一些PGpoint类型的字段头上,添加@Type注解和您创建它的名称:
@TypeDef(name = "type", typeClass = PGPointType.class)
@Entity
public class Entity
@Type(type = "type")
private PGpoint pgPoint;
// Getters and setters
亲切的问候。
【讨论】:
这个答案太棒了!我看了很多,目前它可以保存,更新和获取。谢谢!以上是关于如何使用 PGpoint 使用 PostgreSQL 进行地理定位?的主要内容,如果未能解决你的问题,请参考以下文章