Я искал везде, но, похоже, ни у кого не было этой проблемы, с которой я столкнулся.
У меня есть база данных 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()]));
}
};
}
Я бегу гладко.Дело в том, что в моей БД у домашних животных есть местоположение (поля lat и lon), и я хочу, чтобы пользователь мог сначала найти ближайший.
Я уже создал функцию 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, которую я сделал, чтобы я мог упорядочить домашних животных по расстоянию и отфильтровать по указанным фильтрам.
Я не могу вызватьEntityManager из статического контекста toPredicate, поэтому я не могу жестко закодировать там свои скрипты SQL ...
Майнинг через StackOverflow Я узнал, как это сделать, не включая фильтрацию спецификации JPA, но это то, что я могуСорви мою систему.Спасибо, что прочитали.Есть мысли?