2017-09-04 1 views
0

J'ai la requête suivante et j'ai eu une liste avec le type de données Double. Dans cette requête, j'ai comme paramètre la longitude et la latitude d'un emplacement spécifique et aussi la distance. Avec le paramètre "distance", je peux sélectionner la plage entre les différents emplacements.HQL, SQL - Obtenir l'objet entier (Get distance)

Mon problème est maintenant, je voudrais obtenir un ensemble "City" - objets dans ma liste de résultats et pas seulement une liste de la distance de différenciation (double). Comment est-ce que je devrais modifier que j'ai reçu une liste de mon entité "City" et pas seulement Floats?

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

Merci beaucoup pour toute l'aide

Répondre

0

Ajouter SELECT * dans la requête, et indiquez votre entité en tant que deuxième paramètre de la méthode createNativeQuery() ...

Essayez une requête SQL, semblable à ceci:

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 

Et la partie 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, ceci renverrait la ville source et, si elle est dans la table ...

+0

Merci beaucoup !!! Une question - comment puis-je exclure la ville source? – CommanderHP

+0

Ajoutez un identifiant unique aux paramètres, (à la fois la méthode et la requête,) et 'id <>: id' à la clause' WHERE' ... –

+0

Vous pouvez "améliorer" ceci en utilisant cet identifiant unique et la distance , et obtenir des valeurs longues/lat de la table elle-même, par l'ID ... –