根据曼哈顿距离选择具有复合(嵌入)属性的对象

时间:2017-01-23 16:12:24

标签: java hibernate hql

考虑以下对象类:

+---------------------------+        +----------------------+
|Planet()                   |        |Coordinate()          |
+---------------------------+        +----------------------+
|coordinates   Coordinate() |        |xcoordinate       int |
|lastVisit              int |        |ycoordinate       int |
+---------------------------+        +----------------------+

我希望得到与另一个星球在z单位范围内的行星,但只有那些具有最高lastVisit数的行星,这样我才能获得最新的行星信息(有可能多次保存同一行星,在不同的" lastVisit" s。

Coordinate()对象使用@Embeddable进行注释,并且在行星对象中为@embedded

在我的DAO中,我有这个方法,几乎我想要的东西 - 我只能提取地球的最新实例:

@Override
public List<Planet> getRecentPlanets() {
    Session session = sessionfactory.getCurrentSession();

    // create a query and sort it by last name using sql
    Query<Planet> theQuery = session.createQuery("FROM Planet p WHERE (p.coordinates.xcoordinate, p.coordinates.ycoordinate, p.lastVisit) in"
            + "(SELECT p1.coordinates.xcoordinate, p1.coordinates.ycoordinate, max(p1.lastVisit) FROM Planet p1 group by p1.coordinates)",
                                                            Planet.class);

    return theQuery.getResultList();
}

但是,我似乎无法掌握如何在数据库方面包含曼哈顿距离。

我的问题是:

  1. 如何使用HQL在数据库端实现此选择?
  2. 这是否明智地表现出来?是否适合在java类中进行距离计算?
  3. 我如何尝试使用 hibernate条件(我还没有完全理解)在性能和详细程度方面达到相同的目标?
  4. 如果每个回合有更大的网格和更多的访问次数会对答案产生影响吗?
  5. 附加信息:数据库大小受稀疏曼哈顿网格约500x500的限制。我估计不会超过200转,每转约50&#34;访问&#34;可能会发生。

0 个答案:

没有答案