java - 如何使用 JPA (hibernate) 捕获数据库中动态生成的列的值?

标签 java spring hibernate jpa spring-data-jpa

假设我有以下 JPA 实体:

@Entity
@Table(name = "places")
public class Place {

    @Id @GeneratedValue
    private Long id;
    private String name;
    private double lat;
    private double lng;

    // Getters and setters
}

还有一个名为 PlacesRepository 的 Spring 存储库,它具有 native 查询:

public interface PlacesRepository extends CrudRepository<Place, Long> {

    @Query(
        value = "SELECT *, DISTANCE(lat,lng,:myLat,:myLng) AS distance " +
                "FROM places ORDER BY distance",
        nativeQuery = true
    )
    List<Place> nearestPlaces(
        @Param("myLat") double myLat,
        @Param("myLng") double myLng
    );

}

DISTANCE 函数只是为了举例说明 native 数据库函数。由于我使用的是 PostGIS,因此它相当于 ST_Distance。它使用每个记录的坐标和方法的坐标返回距离。

如何捕获“距离”字段而不将其存储在表中???我不想存储它,因为它是动态的。我只想将它与实体作为 json 一起返回。

最佳答案

这里的一个选项是使用 HQL,而不是 native 查询。例如,您可以创建一个简单的结果类:

class PlaceToDistancePair {
    private Place place;
    private double distance;
    public PlaceToDistancePair(Place place, double distance) {
        this.place = place;
        this.distance = distance;
    }
// getters and setters
}

然后你的@Query将看起来像这样:

@Query(
        value = "SELECT new PlaceToDistancePair(p, DISTANCE(lat,lng,:myLat,:myLng)) FROM places p")
List<PlaceToDistancePair> placeToDistanceList;

您可以找到有关选择新的更多信息here在那里您还会发现选择新 map 构造,它也许也适合您在没有PlaceToDistancePair类的情况下将地点映射到距离。

但是,如果您的函数(例如 ST_Distance)未在 hibernate 方言中注册,您需要自行注册。检查here Vlad 如何在“使用 Hibernate Dialect 注册 SQL 函数”部分中做到这一点。

您还可以选择使用 CriteriaBuilder API,它更加灵活,但需要更多代码。阅读 here了解更多

关于java - 如何使用 JPA (hibernate) 捕获数据库中动态生成的列的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61222955/

相关文章:

hibernate - 在 PostgreSQL 和 SpringBoot (JPA) 中创建序列的问题

java - Hibernate 在 Oracle 中使用序列生成器和序列

java - 如何以编程方式将 java jks keystore 转换为 pkcs12 证书?

java - 应用程序服务器线程和 JPA/Hibernate 乐观锁定 - OptimisticLockException

java - 在 Spring 中运行相同 cron 作业的多个实例

java - 这个 Spring Security 图意味着什么?

java - Spring Boot 中 @oneToMany 双向映射的问题

java - 范围报告 : Not able to see the screenshots on other machine

java - Java 中 SOAP 和 RESTful Web 服务的主要区别

java - 当被调用者成员发生序列化异常时,Hazelcast 调用者成员会抛出超时异常