4

このWORKINGアプローチを使用して、Hibernate Spatialライブラリ(http://www.hibernatespatial.org/)を使用してデータベースから空間データ(つまりポイント)を返そうとしています...

    ... 
    Session session = sessionFactory.openSession();
    Query query = session.createQuery("select location, distance(location, :requestPoint) from "+Event.class.getName());
    query.setParameter("requestPoint", requestPoint);

    List<?> rows = query.list();
    session.close();

    List<Event> events = new ArrayList<Event>();

    for (Iterator<?> it = rows.iterator(); it.hasNext(); ) {
       Object[] row = (Object[]) it.next();

       Event event = new Event();
       event.setLocation((Point) row[0]);
       event.setDistance((Double) row[1]);

       events.add(event);
    }

    return events;

しかし、私はこのようなものを使用したいと思います(選択ステートメントでイベントクラスコンストラクターを使用します)...

    Session session = sessionFactory.openSession();
    Query query = session.createQuery("select new Event(location, distance(location, :requestPoint)) from "+Event.class.getName());
    query.setParameter("requestPoint", requestPoint);

    List<Event> rows = query.list();
    session.close();

    return rows;

問題は、2番目のアプローチで次の例外が発生することです...

org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate appropriate constructor on class [com.jaygridley.aet.Event] [select new Event(location, distance(location, :requestPoint)) from com.jaygridley.aet.domain.Event]

しかし、 Event クラス内にコンストラクターがあるため、理由がわかりません...

public Event(Point location, Double distance) {
    this.location = location;
    this.distance = distance;
}

明確にするために、イベントクラスには次のプロパティがあります...

@Column(name="LOCATION", columnDefinition = "MDSYS.SDO_GEOMETRY", nullable = false)
@Type(type = "org.hibernate.spatial.GeometryType")
private Point location;

private Double distance;

Hibernate が返す各列の戻りクラスを確認したところ、Point と Double に一致します。誰かが私が間違っていることを知っていますか? ありがとうございます!

4

3 に答える 3

1

私の唯一の推測は、イベントコンストラクターの署名があり、引数が距離(ポイント、ダブル)に解決されるEvent(Point, Double)このようにインスタンス化しようとしているため、オートボクシングが機能していないということです。Event(location, distance(location, :requestPoint))

使用している関数を確認しましたが、ではなくが返されます。doubleDouble

" で試すselect new Event(location, new Double(distance(location, :requestPoint)))ことはできますが、確実ではありません。

関数がパラメーターとして 2 つの Geometry を必要とすることも考えられますが、それが正しいかどうかはわかりません。

于 2012-10-21T16:05:12.703 に答える
0

コンストラクター呼び出しの :requestPoint クエリ パラメーターが主な問題であると思われます。テストするには、実際の double 値をそこに入れてみて、コンパイルされるかどうかを確認してください。例えば:

 Query query = session.createQuery("select new Event(location, 2.0) from "+Event.class.getName());

見るだけです。その場合、コンパイラが distance() 関数からの戻り値の型を評価する前に、コンストラクターのシグネチャを評価しようとしている可能性があります。残念ながら、その場合の修正方法を提案することはできません。

于 2012-12-06T20:20:26.467 に答える
0

コンストラクターで location パラメーターの Point の代わりに Object を使用し、その後コンストラクター本体で Point にキャストすることで解決しました。

于 2012-12-06T22:57:24.937 に答える