gpt4 book ai didi

java - 比较所有模型对象

转载 作者:行者123 更新时间:2023-12-02 07:10:01 25 4
gpt4 key购买 nike

我希望能够将模型对象的 id 传递给方法,然后将其与该模型类型的所有其他对象进行比较,以查看其某些属性是否匹配。我知道您可以使用 Models Finder 进行更常规的查询,但我需要使用我编写的一些自定义方法来进行比较。有没有办法遍历所有现有的模型对象,将它们的属性与相关对象的属性进行比较,并将匹配项存储为某种列表。 Finder 能够做到这一点吗?

我正在使用 EBean。

更新:

所以我的模型实际上比我之前使用的书籍示例稍微复杂一些。它是一个存储用户旅程信息的模型。该模型的四个属性如下所示:

    public Double sLat;
public Double sLon;
public Double eLat;
public Double eLon;

这些 double 代表旅程起点的纬度和经度以及终点的纬度和经度。我正在使用上一篇文章中描述的 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");
}

}

所以我的问题实际上是如何使用这些方法 - 进行一次旅程,四个 double 代表其积分并将其与所有其他旅程进行比较。我不确定是否有办法使用 EBean finder 来分割它。

进一步更新:

所以我想我现在已经快到了,但我遇到了一个 Play 错误:没有找到 Double 类型的 QueryString 绑定(bind)器。我的新匹配器方法:

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;
}

最佳答案

假设您使用 JPA 和 Hibernate 等库来实现持久性,有几种方法可以实现这一点。

public static List<Book> findMatch(Book id){
List<Book> allBooks = JPA.em().createQuery("FROM Book").getResultList();
List<Book> matchedBooks = new ArrayList<Book>();
for(Book b : allBooks){
if(isPossibleMatch(b, id)) //assuming you define a .isPossibleMatch() method
matchedBooks.add(b);
}
return matchedBooks;
}

public static List<Book> findMatch(Book id){
Query query = JPA.em().createQuery("SELECT b FROM Book b WHERE b.fieldOne = :fieldOne AND b.fieldTwo : fieldTwo");
query.setParameter("fieldOne", id.fieldOne);
query.setParameter("fieldTwo", id.fieldTwo);
return query.getResultList();
}

编辑:为了完整性,将保留上述内容,但这里是 Ebean 解决方案的编辑。

http://www.playframework.com/documentation/2.0.4/JavaEbean 中的示例所示,您可以为 Book 类实现静态“查找”字段。

public static Finder<Long,Book> find = new Finder<Long,Book>(Long.class, Book.class);

从那里,它与上面的 JPA 代码非常相似,但是通过调用

获取所有 Book 对象的列表的方式会有所不同
Book.find.all()

但是,如果您希望能够在评论中执行操作,例如查找 2.50 美元到 4.50 美元之间的书籍,您可以使用 Finder 编写查询,如下所示:

Book.find.where().between("price", 2.5, 4.5).findList();

where() 方法应该对您有用,可以在http://www.avaje.org/static/javadoc/pub/com/avaje/ebean/Query.html#where%28%29 找到。

关于java - 比较所有模型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15642151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com