所以我决定将纬度和经度存储为BigDecimals
但是现在当我查询一个值时,我想要留出一点余地,这样如果我们查询相距两个点,我们就不会将它们视为不同(我们指定的点始终是至少相距100米)
即使我填充了已知的测试数据
,以下条件查询也不会选择任何内容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
答案 0 :(得分:1)
似乎找到一个愚蠢错误的最佳方法是在StackOverflow上发布一个问题。
我确信有可用的测试数据。但事实证明我必须非常确定,因为我实际上并没有添加任何内容。
当真的存在时,确实是测试数据,上面的查询工作正常。
我有兴趣看到有关如何改进查询的意见,因为它对我的口味有点啰嗦但是......