我正在使用 POSTGIS 内置函数查询我的数据库,以检索Machine
给定位置的最接近的 s。我必须使用原生 SQL,因为 Hibernate 不支持 POSTGIS 和 CTE:
@Repository
public interface MachineRepository extends JpaRepository<Machine, Long>{
@Query(value =
"with nearest_machines as\n" +
" (\n" +
" select distance_between_days(:id_day, machine_availability.id_day) as distance_in_time,\n" +
" ST_Distance(geom\\:\\:geography, ST_SetSrid(ST_MakePoint(:longitude, :latitude), 4326)\\:\\:geography) as distance_in_meters,\n" +
" min(id_day) over (partition by machine.id) as closest_timeslot_per_machine,\n" +
" machine_availability.id_day,\n" +
" machine.*\n" +
" from machine\n" +
" join machine_availability on machine.id = machine_availability.id_machine\n" +
" where machine_availability.available = true\n" +
" and machine_availability.id_day >= :today\n" +
" and ST_DWithin(geom\\:\\:geography, ST_SetSrid(ST_MakePoint(:longitude, :latitude), 4326)\\:\\:geography, 1000)\n" +
" )\n" +
"select nearest_machines.*\n" +
"from nearest_machines\n" +
"where id_day = closest_timeslot_per_machine\n" +
"order by distance_in_time, distance_in_meters\n" +
"limit 20;",
nativeQuery = true)
List<Machine> findMachinesAccordingToAvailabilities(@Param("longitude") BigDecimal longitude,
@Param("latitude") BigDecimal latitude,
@Param("id_day") String idDay,
@Param("today") String today);
}
当然,Machine
并且MachineAvailability
是@Entity
的。它们是@OneToMany(fetch = FetchType.EAGER)
相关的。我将默认的 LAZY 更改为 EAGER,因为我需要MachineAvailability
在最终的 JSON 中。
问题是它通过结果机器触发了另外 2 个请求(即著名的 N+1 问题)。
1.我怎样才能在一个请求中解决这个问题?
2.是否有可能以某种方式创建我的 JSON 并直接返回它MachineController
?