如何在JPA中查询BigDecimal范围

时间:2012-08-23 14:12:08

标签: hibernate jpa-2.0 criteria-api bigdecimal

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

1 个答案:

答案 0 :(得分:1)

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

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

当真的存在时,确实是测试数据,上面的查询工作正常。

我有兴趣看到有关如何改进查询的意见,因为它对我的口味有点啰嗦但是......