0

モデルオブジェクトのIDをメソッドに渡して、それをそのモデルタイプの他のすべてのオブジェクトと比較して、特定の属性が一致するかどうかを確認できるようにしたいと思います。Models Finderを使用して従来のクエリを実行できることは知っていますが、比較を行うには、作成したカスタムメソッドをいくつか使用する必要があります。既存のすべてのモデルオブジェクトを調べ、それらの属性を関連するオブジェクトの属性と比較し、一致を保存する方法は、ある種のリストです。Finderはこれを行うことができますか?

私はEBeanを使用しています。

アップデート:

したがって、私のモデルは、実際には、以前に使用した本の例よりも少し複雑です。これは、ユーザーが行った旅に関する情報を保存するためのモデルです。モデルの4つの属性を以下に示します。

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

これらの倍精度浮動小数点数は、旅の始点の緯度と経度、および終点の緯度と経度を表します。以前の投稿で説明したHarvesineFormulaを使用しています:Javaで距離を測定し、2つの緯度と経度のポイントに基づいてバウンディングボックスを作成するにはどうすればよいですか?

したがって、私のモデルでは、以下の方法を使用して2点間の距離を計算します。

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

    }

ですから、私の質問は、これらの方法をどのように使用できるかということです。1つの旅をして、4つのダブルがそのポイントを表し、他のすべての旅と比較します。EBeanファインダーを使用してこれを分割する方法があるかどうかはわかりません。

さらなる更新:

ですから、もうすぐそこにいると思いますが、再生エラーが発生しています。Double型のQueryStringバインダーが見つかりません。私の新しいマッチャーメソッド:

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 に答える