所以我决定将纬度和经度存储为 BigDecimals
但是现在当我查询一个值时,我想留出一点余地,这样如果我们查询相距米的两个点,我们就不会将它们视为不同(我们指定的点总是至少 100m分开)
即使我填充了已知的测试数据,以下条件查询也不会选择任何内容
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();
}
我毫不怀疑问题出在椅子和键盘之间。但我看不出它是什么。
提前致谢
测试环境是在我的运行 SQL 2008 Express R2 的 Windows 7 开发机器上使用 Hibernate 的 JPA2