jpa 如何处理Java中未知类型的表列(Spring Data)?

w6lpcovy  于 2023-08-06  发布在  Java
关注(0)|答案(1)|浏览(76)

我有一个列类型为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;
    }
}

mccptt67

mccptt671#

在我从@Pilosa的评论中发现hibernate-spatial后,我添加了一些依赖项:

<dependency>
    <groupId>org.locationtech.jts</groupId>
    <artifactId>jts-core</artifactId>
    <version>1.16.1</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-spatial</artifactId>
    <version>5.4.10.Final</version>
</dependency>

字符串
我在Entity类中添加了一个org.locationtech.jts.geom.Point字段来Map地理列。

@JsonIgnore
@Column(columnDefinition = "geography(Point,4326)")
private Point geog;


@JsonIgnore注解是因为Jackson在尝试反序列化字段时抛出了堆栈溢出异常(参见相关的question)。这个解决方案对我很有效,因为我只使用点来查询,而不需要它的值。

相关问题