Спецификация JPA - объединить таблицу с пользовательским результатом функции SQL и упорядочить по - PullRequest
0 голосов
/ 21 октября 2018

Я искал везде, но, похоже, ни у кого не было этой проблемы, с которой я столкнулся.

У меня есть база данных 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, но это то, что я могуСорви мою систему.Спасибо, что прочитали.Есть мысли?

...