【问题标题】:HQL, SQL - Get whole object (Get distance)HQL,SQL - 获取整个对象(获取距离)
【发布时间】:2017-09-04 18:30:40
【问题描述】:

我有以下查询,我得到了一个数据类型为 Double 的列表。 在此查询中,我将特定位置的经度和纬度以及距离作为参数。 使用“距离”参数,我可以选择不同位置之间的范围。

我现在的问题是,我想获得一个完整的“城市”——我的结果列表中的对象,而不仅仅是一个来自不同距离的列表(双精度)。 我应该如何修改我从我的实体“城市”获得了一个列表,而不仅仅是浮动?

    public List<Double> findCityAroundSelectedCity(double longitude, double latitude, float distance) {

    String queryString = "SELECT (6371 * acos (cos(radians(" + latitude
            + ")) * cos(radians(latitude)) * cos(radians(longitude) - radians(" + longitude + "))  + sin(radians("
            + latitude + ")) * sin(radians(latitude)))) AS distance FROM City c HAVING distance < " + distance
            + " ORDER BY distance";

    Query query = entityManager.createNativeQuery(queryString);

    List<Double> list = null;
    list = query.getResultList();

    return list;
}

非常感谢大家的帮助

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    在查询中添加SELECT *,并将你的实体指定为方法createNativeQuery()的第二个参数...

    尝试SQL 查询,类似于:

    SELECT *
    FROM ( SELECT *, ( 6371 * ACOS( COS( RADIANS( :lat ) ) * COS( RADIANS( latitude ) ) *
                       COS( RADIANS( longitude ) - RADIANS( :lng ) ) + SIN( RADIANS( :lat ) ) *
                       SIN( RADIANS( latitude ) ) ) ) AS distance
           FROM City ) c
    WHERE distance < :dis
    ORDER BY distance
    

    还有Java 部分:

    public List<City> findCityAroundSelectedCity( double longitude, double latitude,
                                                  float distance )
    {
       // queryString should be a private static final, outside this method...
       return (List<City>) entityManager.createNativeQuery( queryString, City.class )
          .setParameter( "lat", latitude ).setParameter( "lng", longitude )
          .setParameter( "dis", distance ).getResultList();
    }
    

    顺便说一句,这也会返回源城市,如果它在表中...

    【讨论】:

    • 在参数(方法和查询)和id &lt;&gt; :id 中添加一些唯一的id 到WHERE 子句...
    • 您可以通过使用这个唯一的 id 和距离,并通过 id 从表本身获取 long/lat 值来“改进”这一点...
    • 知道了..... SELECT * FROM ( SELECT *, ( 6371 * ACOS( COS( RADIANS( :lat ) ) * COS( RADIANS( latitude ) ) * COS( RADIANS( longitude ) - RADIANS( :lng ) ) + SIN( RADIANS( :lat ) ) * SIN( RADIANS( latitude ) ) ) 作为距城市的距离) c 距离 :lat AND longitude :lng ) 按距离排序";
    • 一个添加。问题:如果我的距离 = 50 公里,但我只想拥有真正靠近它的城市(如 TOP10)......我该怎么做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多