如何将JpaQuery的结果映射到自定义DTO



我有一个Hotspot实体类和下面的查询,它应该返回一个NearHotspot对象列表:

Query("SELECT h, SQRT(POW(69.1 * (h.latitude - :geo_lat), 2) + POW(69.1 * (:geo_long - h.longitude) * COS(h.latitude / 57.3), 2)) AS distance FROM Hotspot h ORDER BY distance")
List<NearHotspot> findClosestHotspots(@Param("geo_long") Double geo_long, @Param("geo_lat") Double geo_lat);

NearHotspot对象具有Hotspot的所有字段和一个Double类型的距离字段。

@Data
@Builder
@AllArgsConstructor
public class NearHotspot {
private Long id;
private String name;
private String description;
private String category;
private String address;
private Integer zip;
private String city;
private String email;
private String url;
private String phone;
private Double longitude;
private Double latitude;
private LocalDate createdAt;

private Double distance;
}

我现在的问题是:如何将查询结果映射到List<NearHotspot>

我认为有两个问题:

  • 响应类型为List
  • 查询类型返回热点对象和距离

您正试图在查询中返回NearHotspot对象和sqrt结果。由于sqrt的原因,这将无法映射到NearHotspot实体对象。您需要将结果投影到接口dto,因为查询的结果不同,所以无法将查询的结果映射到当前对象。参考博客文章https://medium.com/swlh/spring-data-jpa-projection-support-for-native-queries-a13cd88ec166

另一种方法可以是使用返回值List<对象[]>以及从List<对象[]>到NearHotspot。

最新更新