Критерий запроса - где предикат с пользовательской пользовательской функцией

Я сделал функцию для вычисления расстояния между двумя координатами в postgreSQL. Я хотел бы использовать его в своем проекте, чтобы сравнить результат функции с указанным пользователем максимальным расстоянием. Моя функция выглядит так:

create or replace function distance(lat double precision, lng double precision, db_lat double precision, db_lng double precision)
  returns double precision as $dist$ 
  begin 
  return 
  6371 * acos(
      cos(radians(lat)) * cos(radians(db_lat))
      *
      cos(radians(db_lng) - radians(lng))
      +
      sin(radians(lat))
      *
      sin(radians(db_lat))
    );
    
    end;
    $dist$ language plpgsql;

Он вычисляет расстояние между двумя координатами, одна из которых задается пользователем (для установки точки, вблизи которой они хотят найти записи), другая (с db_) из существующей записи в базе данных. Это работает, когда я пробую это в pgAdmin, но я не уверен, как реализовать это в моем проекте Java:

public static Specification<Rental> inProximity(Double distance, Double lat, Double lng) {
        if (distance == null || lat == null || lng == null) {
            return null;
        } else {
            return (root, query, cb) ->
                cb.greaterThanOrEqualTo(
                            distance,
                            cb.function("distance", Double.class,
                                    cb.literal(lat),
                                    cb.literal(lng), 
                                    root.get("locationLat"),
                                    root.get("locationLng"))
                    );
        }
    }

Он помечает все красным, а ошибка гласит: Cannot resolve method 'greaterThanOrEqualTo(java.lang.Double, javax.persistence.criteria.Expression<T>)' Почему возврат функции не помечен как Double, чтобы сравнивать два двойника?

Когда я не оборачиваю свои широту и длину cb.literal(),, ошибка говорит следующее:

ошибка


person mintas123    schedule 08.11.2020    source источник


Ответы (1)


Вау, это было намного проще, чем я ожидал...

cb.greaterThanOrEqualTo(
                            distance,
                            cb.function("distance", Double.class,
                                    cb.literal(lat),
                                    cb.literal(lng), 
                                    root.get("locationLat"),
                                    root.get("locationLng"))
                    );

должно быть

cb.lessThanOrEqualTo(
                            cb.function("distance", Double.class,
                                    cb.literal(lat),
                                    cb.literal(lng), 
                                    root.get("locationLat"),
                                    root.get("locationLng")),
                            distance
                    );

Как-то я напортачил с заказом...

person mintas123    schedule 08.11.2020