2017-09-04 44 views
0

我有以下查询,并获得了数据类型为Double的List。 在这个查询中,我有一个特定的位置和距离作为参数的经度和纬度。 随着“距离”参数我可以选择不同位置之间的范围。HQL,SQL - 获取整个对象(获取距离)

我的问题是现在,我想要得到一个完整的“城市” - 在我的结果列表中的对象,而不是从不同距离(双)的列表。 我应该如何修改我从我的实体“城市”获得一个列表,而不仅仅是花车?

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

非常感谢您的所有帮助

回答

0

添加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(); 
} 

BTW,这将返回源城为好,如果是在表...

+0

太谢谢你了!一个问题 - 我如何排除源城市? – CommanderHP

+0

为参数(方法和查询)和'WHERE'子句中的'id <>:id'添加一些唯一的ID ... –

+0

使用此唯一ID和距离可以“改善” ,并从表本身获取长/纬度值,通过编号... –