Java JPA2标准API运行时从varchar(25)转换为十进制

Java JPA2标准API运行时从varchar(25)转换为十进制,java,criteria-api,Java,Criteria Api,所以我已经看到了类似主题的堆栈溢出上的所有线程,但我没有找到解决问题的方法 我试图创建一个条件查询,得到以下SQL(第一个SQL,简化): 那是因为我的纬度是varchar(25)型。所以这就解决了它(第二个SQL): 从以下站点选择纬度(ABS(转换(纬度为十进制)-45.893227)经过一些搜索,我找到了一种使用java derby DOUBLE函数使用CriteriaBuilder函数强制运行时转换的方法: Expression Lat = stations.get("latit

所以我已经看到了类似主题的堆栈溢出上的所有线程,但我没有找到解决问题的方法

我试图创建一个条件查询,得到以下SQL(第一个SQL,简化):

那是因为我的纬度是varchar(25)型。所以这就解决了它(第二个SQL):


从以下站点选择纬度(ABS(转换(纬度为十进制)-45.893227)经过一些搜索,我找到了一种使用java derby DOUBLE函数使用CriteriaBuilder函数强制运行时转换的方法:

    Expression Lat = stations.get("latitude");

    Expression LatCast = cb.function("DOUBLE", Float.class, Lat);
我得到了以下SQL查询类型:

DOUBLE(LATITUDE)
参考文献:

它适用于大多数受支持的数据库功能

SELECT latitude FROM stations WHERE (ABS(CAST(latitude AS DECIMAL) - 45.893227) <= 0.2)
public List<Stations> searchStations(Float distance, List<Address> addresses) {
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Stations> cq = cb.createQuery(Stations.class);
    Root<Stations> stations = cq.from(Stations.class);

    //this <Float> cast actually does nothing:
    Expression<Float> Lat = stations.get("latitude");
    Expression<Float> Lon = stations.get("longitude");

    //make a list of conditions
    List<Predicate> predicates = new ArrayList<>();
    for (Address a : addresses) {
        Float aLat = Float.valueOf(a.getLatitude());
        Float aLon = Float.valueOf(a.getLongitude());


        //condition: |station.Lat - address.Lat| <= distance
        //le() = lessThan, abs() = absolute, diff() = subtraction

        Predicate condLat = cb.le(cb.abs(cb.diff(Lat, aLat)), distance);
        Predicate condLon = cb.le(cb.abs(cb.diff(Lon, aLon)), distance);

        //if I do: Lat.as(Float.class) it won't cast on runtime!

        predicates.add(condLat);
        predicates.add(condLon);
    }

    //add the array of conditions to the WHERE expression, connected with AND:
    cq.where(cb.and(predicates.toArray(new Predicate[predicates.size()])));

    TypedQuery<Stations> q = em.createQuery(cq);
    return q.getResultList();
}
    Expression Lat = stations.get("latitude");

    Expression LatCast = cb.function("DOUBLE", Float.class, Lat);
DOUBLE(LATITUDE)