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

时间:2020-09-28 13:51:32

标签: java sql spring spring-boot jpa

我有一个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>

我认为有两个问题:

  • 响应类型为列表
  • 查询排序返回一个热点对象和距离

1 个答案:

答案 0 :(得分:0)

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

另一种方法可能是使用返回值List 并使用映射器将List 映射到NearHotspot。