我到处搜索,但似乎没有人遇到我遇到的这个问题。
我有一个具有某些属性的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规范过滤的情况下如何执行此操作,但这是我无法摆脱的系统。感谢您的通读。可以吗?