0

バックグラウンド:

レガシー データベースがあり、そのスキーマを変更できません。私のエンティティのマッピングは次のようになります。

class SomeObject {
    @Column(name = "LONGITUDE", nullable = false)
    public BigDecimal longitude;

    @Column(name = "LATITUDE", nullable = false)
    public BigDecimal latitude;

    ...
}

問題:

サークル内のすべてのSomeObjectsを選択する休止状態のクエリを作成する必要があります。この問題を解決するには、Hibernate Spatialを使用するのが適切なツールである必要があります。しかし、私が見つけることができるすべての例は、私が持っているように座標に別々の列を使用する代わりに、タイプPointの列を宣言しています。私はdbスキーマを変更できないので、そのようなアプローチはうまくいきません。

では、休止状態空間を使用してこの問題を解決できますか? はいの場合、クエリはどのようになりますか?

解決:

Karthik Prasad は、空間とは何か、一般的にどのようなオプションがあるのか​​を明確かつ正確に説明しました。私はOracle DBを使用しているので、もう1つのオプションがありました.sdo_geomパッケージを使用してください。したがって、最後に、休止状態のクエリ/基準の代わりに、SQL クエリを使用しました。

select * 
from SOMETHING
where 
-- add box to decrease number of records
-- where box is radius converted to degree by multiply on (1. / 69.) * 1.1 
:lon - :box < longitude and longitude < :lon + :box and 
:lat - :box < latitude and latitude < :lat + :box and 
sdo_geom.sdo_distance(
  sdo_geometry(2001, 4326, null, sdo_elem_info_array(1, 1, 1), sdo_ordinate_array(longitude, latitude)),
  sdo_geometry(2001, 4326, null, sdo_elem_info_array(1, 1, 1), sdo_ordinate_array(:lon, :lat)),
  1, 'unit=mile') < :radius
4

1 に答える 1