我有一个列类型为geography(Point,4326)
的表(使用PostGIS)。我只需要在查询表时在WHERE条件中使用此列。例如,在下面的查询中,geog
是该列的名称。
@Query(value = "SELECT pois.*\n" +
"FROM pois,\n" +
"(select ST_MakePoint(:lat,:lon)::geography as poi) as poi\n" +
"WHERE ST_DWithin(geog, poi, 400)\n" +
"ORDER BY ST_Distance(geog, poi)", nativeQuery = true)
public List<PointOfInterest> getPOIsAroundLocation(@Param("lat") double lat,
@Param("lon") double lon);
字符串
但是,在实体类PointOfInterest
中,我不知道如何Map该列,因为我没有与geography(Point,4326)
数据库类型等效的Java类型。
如果我在类中根本没有提到这个列,它就不会在数据库中创建(我有spring.jpa.hibernate.ddl-auto=create
),查询就会失败。
我该怎么办?有没有一种方法可以创建一个java类型的列(也许是Object
?),然后用一些注解将其Map到db类型?或者有没有一种方法可以告诉Spring Data关于db列的信息,而不需要实际添加一个我不会在类中使用的字段?
下面是PointOfInterest
类:
@Data
@Entity(name = "pois")
public abstract class PointOfInterest {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private final double latitude;
private final double longitude;
private final PoiType poiType;
public PointOfInterest() {
this.latitude = this.longitude = 0;
poiType = null;
}
public PointOfInterest(double latitude, double longitude, PoiType poiType) {
this.latitude = latitude;
this.longitude = longitude;
this.poiType = poiType;
}
}
型
1条答案
按热度按时间mccptt671#
在我从@Pilosa的评论中发现hibernate-spatial后,我添加了一些依赖项:
字符串
我在Entity类中添加了一个
org.locationtech.jts.geom.Point
字段来Map地理列。型
@JsonIgnore
注解是因为Jackson在尝试反序列化字段时抛出了堆栈溢出异常(参见相关的question)。这个解决方案对我很有效,因为我只使用点来查询,而不需要它的值。