目标:我正在尝试通过JPA构建查询,它返回一个位置列表,最接近传递给查询的坐标。需要在查询上应用过滤器,排序和分页的功能。以下本机SQL查询是我到目前为止提出的:
SELECT s.*
,sqrt(power(abs(:latitude-g.latitude),2)+power(abs(:longitude-g.longitude),2)) as d
FROM geolocations g
INNER JOIN salons s
ON g.zip=s.zip
WHERE LOWER(s.salon_name) LIKE LOWER(CONCAT('%',:q,'%'))
ORDER BY d asc limit
:pageSize offset :offset
Paganation,一些排序和基于位置的搜索都在工作,但我无法过滤工作。
过滤器要求规定用户还必须能够按字段过滤搜索结果(0个或更多过滤器),例如owner
,state
,zip
...我想要使用类似querydsl或JPA规范对象的东西来构建一个小的查询语言,但鉴于我使用的是本机查询,我无法构建一个有效的实现。我正在寻找有关如何将字段过滤器实现到现有存储库的任何建议。
这是我的整个存储库:
public interface SalonRepository extends JpaRepository<Salon,String>, JpaSpecificationExecutor<Salon>{
@Query("select s from Salon s where s.city = :city and s.state = :state")
Page<Salon> findByCity(@Param("state")String state,@Param("city")String city,Pageable pageable);
@Query("select s from Salon s where s.salonName = :name")
Page<Salon> findByName(@Param("name")String name,Pageable pageable);
//THIS IS THE ONE I WANT TO ADD THE USER DEFINED FILTERS TO
@Query(value = "select s.*,sqrt(power(abs(:latitude-g.latitude),2)+power(abs(:longitude-g.longitude),2)) as d from geolocations g inner join salons s on g.zip=s.zip where LOWER(s.salon_name) like LOWER(CONCAT('%',:q,'%')) order by d asc limit :pageSize offset :offset", nativeQuery = true)
List<Salon> findNearest(@Param("latitude")float latitude,@Param("longitude")float longitude,@Param("q")String query,@Param("pageSize")int pageSize,@Param("offset") int offset);
@Query(value = "select sqrt(power(abs(:latitude-g.latitude),2)+power(abs(:longitude-g.longitude),2)) as d from geolocations g inner join salons s on g.zip=s.zip where LOWER(s.salon_name) like LOWER(CONCAT('%',:q,'%')) order by d asc", nativeQuery = true)
List<Float> findNearestInt(@Param("latitude")float latitude,@Param("longitude")float longitude,@Param("q")String query);
@Query("select s from Salon s where lower(s.salonName) like LOWER(CONCAT('%',:salonName,'%'))")
Page<Salon> findAll(@Param("salonName")String salonName,Pageable pageable);
}
经过几个小时的搜索后,由于我发现的信息不足,我相当肯定自己走错了路。
感谢任何和所有帮助!