我希望能够将模型对象的 id 传递给方法,然后将其与该模型类型的所有其他对象进行比较,以查看其某些属性是否匹配。我知道您可以使用 Models Finder 进行更常规的查询,但我需要使用我编写的一些自定义方法来进行比较。有没有办法遍历所有现有的模型对象,将它们的属性与相关对象的属性进行比较,并存储匹配项是某种列表。Finder 有能力做到这一点吗?
我正在使用 EBean。
更新:
所以我的模型实际上比我之前使用的书籍示例稍微复杂一些。它是一种存储用户旅程信息的模型。模型的四个属性如下所示:
public Double sLat;
public Double sLon;
public Double eLat;
public Double eLon;
这些双精度数代表旅程起点的纬度和经度以及终点的纬度和经度。我正在使用上一篇文章中描述的 Harvesine 公式:How can I measure distance and create a bounding box based on two latitude+longitude points in Java?
所以在我的模型中,我将使用下面的方法来计算两点之间的距离:
public static double distFrom(double lat1, double lng1, double lat2, double lng2) {
double earthRadius = 3958.75;
double dLat = Math.toRadians(lat2-lat1);
double dLng = Math.toRadians(lng2-lng1);
double sindLat = Math.sin(dLat / 2);
double sindLng = Math.sin(dLng / 2);
double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2)
* Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2));
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
double dist = earthRadius * c;
return dist;
}
我已经用一些硬编码的虚拟数据对此进行了测试,以查看它使用此方法是否按预期工作:
public static void journeyCompare(double lat1, double lng1, double lat2, double lng2,
double lat3, double lng3, double lat4, double lng4) {
double startMatch = distFrom(lat1, lng1, lat3, lng3);
if(startMatch<=5) {
System.out.println("Starting points are within five miles of each other");
double endMatch = distFrom(lat2, lng2, lat4, lng4);
if(endMatch<=5) {
System.out.println("Start and end points are within five miles of each other!!! JOURNEY MATCH");
}
else {
System.out.println("End points are too far apart");
}
}
else {
System.out.println("Starting points are too far apart");
}
}
所以我的问题实际上是我如何能够使用这些方法 - 进行一次旅程,四个双打代表它的积分,并将其与所有其他旅程进行比较。我不确定是否有办法使用 EBean finder 将其拆分。
进一步更新:
所以我想我现在快到了,但我遇到了一个播放错误:No QueryString binder found for type Double。我的新匹配器方法:
public static List<Journey> matcher(Double startLat, Double startLon, Double endLat, Double endLon) {
//Create a list to store matched journeys
List<Journey> matchList = new ArrayList<Journey>();
//Create a list that stores all pre-existing journeys
List<Journey> allJourneys = new ArrayList<Journey>();
allJourneys = find.all();
for(Journey journey : allJourneys) {
double distanceBetweenStart = distFrom(startLat, startLon, journey.sLat, journey.sLon);
//if the starting points are within 3 miles of each other
if(distanceBetweenStart <= 3) {
//check end points
double distanceBetweenEnd = distFrom(endLat, endLon, journey.eLat, journey.eLon);
if(distanceBetweenEnd <= 3) {
matchList.add(journey);
}
}
}
return matchList;
}