VARCHAR2作为Oracle中的数字

时间:2013-12-17 15:45:22

标签: java sql oracle hibernate

我正在尝试通过Hibernate 4加载这个本机SQL语句(对应于Haversine公式的应用程序以获得与给定纬度和经度的距离)。

 SELECT * FROM 
    (SELECT e2.*, t.distance FROM entity e2 inner join 
    (SELECT 3956 * 2 * ASIN( SQRT( POWER(SIN(( :lat - abs(e.latitude)) * 3.14159/180 / 2),2) 
    + COS( :lat * 3.14159/180 ) * COS(abs(e.latitude) *  3.14159/180) 
    * POWER(SIN((:lon - e.longitude) *  3.14159/180 / 2),2) ) ) * 1.609344 as distance, e.id  
    FROM entity e ) t on  t.id = e2.id WHERE TO_NUMBER(distance) < TO_NUMBER(:maxDistance) ORDER BY distance) WHERE rowNum < 30

问题是,纬度和经度存储为VARCHAR2(无论出于何种原因),我无法更改数据模型。

然而,如果我通过我的SQL管理器应用程序运行它,这是开箱即用的,但是在Hibernate中它似乎在VARCHAR2NUMBER转换时出现了一些问题,并且我收到了无效数字错误在SQL中。我尝试使用TO_NUMBER(e.latitude)来强制转换,但它没有实现任何目标。

PD:我实际上尝试了这个(没有参数):

SELECT * FROM 
    (SELECT e2.*, t.distance FROM estaciones e2 inner join 
        (SELECT 3956 * 2 * ASIN(
                                SQRT( 
                                    POWER(SIN(( 42.5 - abs(e.latitud)) * 3.14159/180 / 2),2)
                                    + COS( 42.5 * 3.14159/180 ) * COS(abs(e.latitud) *  3.14159/180) 
                                    * POWER(SIN((-8.3 - e.longitud) *  3.14159/180 / 2),2) 
                                ) 
                            ) * 1.609344 as distance, e.idEstacion  
        FROM estaciones e ) t on  t.idEstacion = e2.idEstacion
    WHERE distance < 30.0 order by distance)
WHERE rowNum < 30;

0 个答案:

没有答案