我正在尝试通过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中它似乎在VARCHAR2
到NUMBER
转换时出现了一些问题,并且我收到了无效数字错误在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;