有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java条件查询带有用户自定义函数的where谓词

我在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_1;)是数据库中现有记录的距离。 当我在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,以便比较两个Double

当我没有用cb.literal(),包装我的lat和lng时,错误是这样的:

error


共 (1) 个答案

  1. # 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
                        );
    

    不知怎么搞砸了订单