Spring Data JPA:根据多列之间的计算值和传递的参数值查找顺序

oknwwptz  于 2022-09-19  发布在  Spring
关注(0)|答案(2)|浏览(142)

这是我假设的实体类,

@Entity
@NoArgsConstructor
@Data
public class Point{
    @Id
    @GeneratedValue
    private Long id;

    private double x;
    private double y;
}

在PointRepository中,我想要一个这样的方法,

List<Point> findAllOrderByDistanceFromPointAsc (double a, double b);

其中距离逻辑可以类似于,

double distance = Math.sqrt( Math.pow((a-x), 2) + Math.pow((b-y), 2) )

基本上,这是两列和两个传递的参数值之间的计算。我理解这可以通过CriteriaQuery或规范或编写自定义本地查询来实现,但我对如何准确实现这一点没有足够的知识。虽然理想情况下,我希望在不编写本机查询的情况下实现这一点。

vhmi4jdf

vhmi4jdf1#

除了您所尝试的有效性之外,如果您想在JPQL中执行此操作,您可以执行以下操作,但请记住,JPQL中对算术函数的支持是有限的,因此转换您的等式并不漂亮

@Query("SELECT p, " +
            "SQRT(((:a - p.x) * (:a - p.x)) + ((:b - p.y) * (:b - p.y))) as distance from Point p " +
            "ORDER BY distance ASC")
    List<Point> findAllOrderByDistanceFromPointAsc (@Param("a") double a, @Param("b") double b);
f0ofjuux

f0ofjuux2#

这里有很多事情需要关注。首先,您必须问自己是否真的希望在数据库服务器上执行距离计算,而不是在应用程序代码中执行距离计算。有关不同方法的论据的概述,请查看question
因为您说要计算表中所有条目到特定点的距离,所以我建议您只获取所有点,而不需要在DB服务器上进行特定计算,并在应用程序代码中进行所有计算。
但是,如果数据库表中有大量记录,并且只需要返回到距离最小的点之一的距离,则可以考虑在db服务器上计算距离,并只返回一个结果。这将显著增加数据库的负载,但减少网络流量,因为您不必发送所有点,只需发送一个点。但是,这假设数据库支持所需的arthmetric运算符,如平方根和幂运算。我认为MySql不支持它们(我可能错了),但PostgresQL支持(见here)。我为postgres数据库编写了一个示例查询,该查询返回最接近点(1,3)的一个点。

SELECT id,
       Min( |/ ( ( 1 - x ) ^ 2 + ( 3 - y ) ^ 2 )) AS Distance
FROM   point
GROUP  BY id
ORDER  BY distance
LIMIT  1;

相关问题