0

所以我决定将纬度和经度存储为 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

4

1 回答 1

1

似乎找到愚蠢错误的最佳方法是在 StackOverflow 上发布问题。

我确信有可用的测试数据。但事实证明我必须非常确定,因为我实际上并没有添加任何内容。

当真的测试数据时,上面的查询可以正常工作。

我很想看看关于改进查询的方法的意见,因为它对我的口味来说有点冗长,但是......

于 2012-08-23T14:30:22.107 回答