使用具有零个或多个参数的JPA本机查询

时间:2017-01-11 06:26:31

标签: java sql hibernate spring-data-jpa

目标:我正在尝试通过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个或更多过滤器),例如ownerstatezip ...我想要使用类似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);

}

经过几个小时的搜索后,由于我发现的信息不足,我相当肯定自己走错了路。

感谢任何和所有帮助!

0 个答案:

没有答案