java - 比较所有模型对象

标签 java playframework playframework-2.0

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

相关文章:

java - 在全屏中显示选定的网格图像,其代码需要在 MainActivity 类中,如下所示

java - 如何正确使用 getDayOfWeek 方法

apache2 - 玩!框架 : what is the difference between Router. getFullUrl ("action")和 Router.reverse ("action").absolute()?

playframework - 如何更改 Play 在执行 “debug run” 命令时使用的默认端口 (9000)?

java - 在某些情况下忽略 Ebean 版本

java - 在方法参数中扩展泛型

scala - 如何通过 Scala 中的 Play Framework 2.5 流式传输压缩文件(即时)?

java - 如何在 Play 中切换生产和开发数据库配置?

java - Play 2 Java 身份验证插件 - HTTP 状态代码响应而不是重定向

java - DebugView 没有可用的设备