JPA规范-具有自定义SQL函数结果和排序依据的联接表

时间:2018-10-21 00:33:27

标签: spring postgresql jpa spring-data-jpa microservices

我到处搜索,但似乎没有人遇到我遇到的这个问题。

我有一个具有某些属性的Pet数据库,并且使用JPA规范进行了过滤器实现:

public static Specification<Pet> byFilter(PetFilter filter) {
    return new Specification<Pet>() {
        @Override
        public Predicate toPredicate(Root<Pet> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
            List<Predicate> predicates = new ArrayList<>();
                (... many predicates.add()....)
                return cb.and(predicates.toArray(new Predicate[predicates.size()]));
            }
    };
}

我的跑步不顺畅。问题是,在我的数据库中,宠物有一个位置(纬度和经度字段),我希望用户能够首先检索到最近的位置。

我已经做了一个SQL函数,以某种方式将按其距离排序的条目返回到一些经纬度......

CREATE OR REPLACE FUNCTION public.gc_dist(lat double precision, lon double precision)
RETURNS TABLE(distance double precision, id bigint)
LANGUAGE plpgsql
AS $function$
DECLARE var_r RECORD;  
BEGIN
    FOR var_r IN (SELECT * FROM pets)
    LOOP 
        distance := ACOS(SIN(var_r.lat)*SIN($1)+COS(var_r.lat)*COS($1)*COS($2-var_r.lon))*6371;    
        id := var_r.id;
        RETURN NEXT;
    END LOOP;
END;
$function$

那东西返回一个表,我可以使用此脚本将主表加入该表:

select (all pets columns) from pets inner join gc_dist(<some lat>,<some lon>) using (id) order by distance;

现在,我一直在试图找出如何将其引入我制定的扩展JPA规范中的方法,这样我就可以按距离将宠物分类并通过指定的过滤器进行过滤。

我无法从toPredicate静态上下文中唤起EntityManager,因此无法在此处对我的SQL脚本进行硬编码...

通过StackOverflow进行挖掘我发现不包括JPA规范过滤的情况下如何执行此操作,但这是我无法摆脱的系统。感谢您的通读。可以吗?

0 个答案:

没有答案