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