2012-08-23 2 views
0

Je pris la décision de conserver la latitude et la longitude comme BigDecimalsComment interroger une gamme BigDecimal dans JPA

mais maintenant, quand je fais une recherche pour une valeur que je veux laisser un peu de marge de manœuvre pour que si nous interrogeons pour deux points de distance, nous ne les traitons pas comme différents (les points que nous spécifions sont toujours espacés d'au moins 100 m)

La requête de critères ci-dessous ne sélectionne rien, même si je remplis avec données de test connues

public List<Location> findLocations(BigDecimal latitude, BigDecimal longitude) { 
     BigDecmial geoPointDifferenceThreshold = new BigDecimal(0.0001).setScale(12, RoundingMode.HALF_EVEN); 
     CriteriaBuilder cb = em.getCriteriaBuilder(); 
     CriteriaQuery<Location> cq =cb.createQuery(Location.class); 

     Root<Location> locationRoot = cq.from(Location.class); 
     Path<BigDecimal> latitudePath = locationRoot.<BigDecimal>get("latitude"); 
     Path<BigDecimal> longitudePath = locationRoot.<BigDecimal>get("longitude"); 

     Predicate latitudeBetweenRange = cb.between(latitudePath, latitude.subtract(geoPointDifferenceThreshold), latitude.add(geoPointDifferenceThreshold)); 
     Predicate longitudeBetweenRange = cb.between(longitudePath, longitude.subtract(geoPointDifferenceThreshold), longitude.add(geoPointDifferenceThreshold)); 

     cq.select(locationRoot).where(latitudeBetweenRange); //within 11m 
     cq.select(locationRoot).where(longitudeBetweenRange); //within 11m 
     return em.createQuery(cq).getResultList(); 
    } 

Je n'ai aucun doute sur le problème est entre la chaise et le clavier. Mais je ne peux pas voir ce que c'est.

merci à l'avance

L'environnement de test est JPA2 avec mise en veille prolongée sur ma machine dev Windows 7 exécutant SQL 2008 Express R2

Répondre

1

Il semble que la meilleure façon de trouver une erreur stupide est de poser une question sur StackOverflow.

J'étais sûr qu'il y avait des données de test disponibles. Mais il s'est avéré que je devais être vraiment sûr parce que je n'allais pas en ajouter.

Quand il ya vraiment, vraiment est des données de test la question ci-dessus fonctionne très bien.

Je serais intéressé de voir des opinions sur les façons d'améliorer la requête car elle est un peu bavarde à mon goût mais ...

Questions connexes