0

我希望能够将模型对象的 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;
}
4

1 回答 1

2

假设您使用 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找到

于 2013-03-26T17:54:32.767 回答