java - 如何使用 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 存储库,它具有本机查询:
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 功能只是为了举例说明本机数据库功能。因为我使用的是 PostGIS,所以它相当于 ST_Distance。它使用每条记录的坐标和方法的坐标返回距离。
如何捕获该“距离”字段而无需将其存储在表中???我不想存储它,因为它是动态的。我只想将实体作为 json 返回。
解决方案
这里的一个选项是使用 HQL,而不是本机查询。例如,您可以创建一个简单的结果类:
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;
您可以在此处找到更多信息,也可以select new
在此处找到select new map
建筑,这可能也适合您将 Place 映射到距离而无需PlaceToDistancePair
分类。
但是,如果您的函数(例如 ST_Distance)没有在休眠方言中注册,您需要自己注册。在“使用 Hibernate Dialect 注册 SQL 函数”部分中查看Vlad 如何执行此操作。
您还可以选择使用 CriteriaBuilder API,它更加灵活,但需要更多代码。在这里阅读更多
推荐阅读
- amazon-web-services - 使用 wav 文件创建 HIT
- c# - 如何通过前端输入字段日期计算年龄?
- google-cloud-dataflow - 数据流流作业早期结果
- react-router - 反应路由器推送到历史并保留相对路径
- networking - 在本地网络上共享一台机器,而不授予对更新等的 Internet 访问权限
- r - R中的算法在保持等级顺序的同时平滑向量
- error-handling - Nuxt 处理来自 Prismic API 的获取错误
- flutter - 如何配置 pubspec.yaml 以添加我从 fluttericon 生成的自定义图标?
- java - 从通知的后台打开后,Android PendingIntent 未启动活动
- blockchain - 随着时间的推移,我如何从 Kulupu (polkadotjs) 获得困难?