4

我正在尝试使用 Hibernate Spatial 库(http://www.hibernatespatial.org/)使用这种 WORKING 方法从数据库中返回空间数据(即点)...

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

问题是第二种方法给了我以下异常......

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))其中 args 解析为距离(点,双)。

我一直在检查您正在使用的函数,它返回a doublenot a Double

您可以尝试使用 "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

通过在构造函数中使用 Object 而不是 Point 作为位置参数并随后在构造函数主体中转换为 Point 来解决。

于 2012-12-06T22:57:24.937 回答