这是我假设的实体类,
@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或规范或编写自定义本地查询来实现,但我对如何准确实现这一点没有足够的知识。虽然理想情况下,我希望在不编写本机查询的情况下实现这一点。
2条答案
按热度按时间vhmi4jdf1#
除了您所尝试的有效性之外,如果您想在JPQL中执行此操作,您可以执行以下操作,但请记住,JPQL中对算术函数的支持是有限的,因此转换您的等式并不漂亮
f0ofjuux2#
这里有很多事情需要关注。首先,您必须问自己是否真的希望在数据库服务器上执行距离计算,而不是在应用程序代码中执行距离计算。有关不同方法的论据的概述,请查看question。
因为您说要计算表中所有条目到特定点的距离,所以我建议您只获取所有点,而不需要在DB服务器上进行特定计算,并在应用程序代码中进行所有计算。
但是,如果数据库表中有大量记录,并且只需要返回到距离最小的点之一的距离,则可以考虑在db服务器上计算距离,并只返回一个结果。这将显著增加数据库的负载,但减少网络流量,因为您不必发送所有点,只需发送一个点。但是,这假设数据库支持所需的arthmetric运算符,如平方根和幂运算。我认为MySql不支持它们(我可能错了),但PostgresQL支持(见here)。我为postgres数据库编写了一个示例查询,该查询返回最接近点(1,3)的一个点。