假设我有以下 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/