この章では、TopLinkによるOracle Spatialのサポートの概要を説明するのみでなく、TopLinkの機能を拡張してOracle Spatialの列のマッピングと問合せ(MDSYS.SDO_GEOMETRY)をサポートする方法についても説明します。
Oracle Spatialの詳細は、http://www.oracle.com/technology/products/spatial/index.htmlを参照してください。
この章の内容は次のとおりです。
TopLinkでは、タイプMDSYS.SDO_GEOMETRYのデータベース列の、oracle.spatial.geometry.JGeometryデータ・タイプの属性へのダイレクト・マッピングをサポートしています。
TopLinkは、TopLinkの式フレームワーク(第110章「TopLinkの式の概要」を参照)を介して空間演算子(112.3.3項「空間演算子式を使用した問合せの実行方法」を参照)もサポートするのみでなく、SDO_GEOMETRYをラップするカスタム・オブジェクト・タイプもサポートします。
OC4J以外のアプリケーション・サーバーでのTopLink構造コンバータの使用に関する詳細は、関連サーバーのドキュメントを参照してください。
TopLink構造コンバータを使用するためのOC4Jアプリケーション・サーバーの構成に関する詳細は、『Oracle Fusion Middleware Administration and Application Deployment Guide for Oracle Containers for Java EE』を参照してください。
TopLinkでは、oracle.toplink.platform.database.DatabasePlatform(96.1.3.1項「データベース・プラットフォーム」を参照)で構造コンバータのリストを格納しています。
カスタム・コンバータを作成するには、oracle.toplink.platform.database.converters.StructConverterインタフェースを実装してフィールドへ直接マッピング(27.3項「フィールドへ直接マッピング」を参照)で登録します。
StructConverterを使用するには、次の手順を実行します。
データベース・プラットフォームを構成します(112.2.1項「構造コンバータ使用のためのデータベース・プラットフォームの構成方法」を参照)。
マッピングを設定します(112.2.2項「構造コンバータを使用したマッピングの設定方法」を参照)。
TopLinkでは、データベース・プラットフォームを使用して(96.1.3.1項「データベース・プラットフォーム」を参照)、SQL言語、ストアド・プロシージャ・コール、順序付けなどデータベース・ベンダー固有およびバージョン固有の操作の使用方法のみでなく、プラットフォーム固有の処理も制御します。TopLinkでデータベースの高度な機能を使用できるようにプラットフォームを構成する必要があります。
DatabasePlatformに構造コンバータを追加するには、DatabasePlatformのaddStructConverter(StructConverter converter)メソッドをコールします。セッション・ログイン前に、TopLinkセッション(サーバーまたはデータベース)内でこのメソッドをコールします(89.3項「セッション・ログインの構成」を参照)。
フィールドへ直接マッピング(27.3項「フィールドへ直接マッピング」を参照)を使用して、STRUCTタイプをマップします。構造コンバータによって定義されたタイプにマップする各マッピングについて、次のようにそのフィールド・タイプをSTRUCTデータ・タイプに設定します。
mapping.setFieldType(java.sql.Types.STRUCT);
oracle.spatial.geometry.JGeometryを使用するには、次の手順を実行します。
データベース・プラットフォームを構成します(112.3.1項「JGeometry使用のためのデータベース・プラットフォームの構成方法」を参照)。
マッピングを設定します(112.3.2項「JGeometry属性のマップ方法」を参照)。
Spatial演算子を使用する式でマッピングされたエンティティを問合せできます。詳細は、112.3.3項「空間演算子式を使用した問合せの実行方法」を参照してください。
データベース・プラットフォームを構成するには、oracle.toplink.platform.database.oracle.converters.JGeometryConverterの形式で構造コンバータを次のように追加します。
databasePlatform.addStructConverter(new JGeometryConverter());
セッション・ログイン前に、TopLinkセッション内でこのプラットフォームを構成する必要があります(89.3項「セッション・ログインの構成」を参照)。
フィールドへ直接マッピング(27.3項「フィールドへ直接マッピング」を参照)を使用して、STRUCTタイプをマップします。構造コンバータ(JGeometry)によって定義されたタイプにマップする各マッピングについて、次のようにそのフィールド・タイプをSTRUCTデータ・タイプに設定します。
mapping.setFieldType(java.sql.Types.STRUCT);
構成済のデータベース・プラットフォームでは、JGeometry属性を持つSDO_GEOMETRY列にマッピングされた永続エンティティを読取りおよび書込みできます。このサポートによって、Oracle Spatial演算子を使用したネイティブSQL問合せで、これらのマッピングされたエンティティに対して問合せを実行できます(http://download-west.oracle.com/docs/cd/B19306_01/appdev.102/b14255/sdo_operat.htm#i76448を参照)。
空間演算子はOracleデータベースによってサポートされている特殊なSQL関数で、ジオメトリ・タイプを含む列の問合せと比較を可能にします。空間演算子は次の形式をとります。
<SPATIAL-OP>(geometry1, geometry2, parameters) = 'TRUE'
空間演算子の詳細は、Oracle Spatial APIのドキュメントを参照してください。
そのoracle.toplink.expressions.spatialパッケージで、TopLinkは次の空間演算子に対して式をサポートしています。
SDO_WITHIN_DISTANCE
SDO_RELATE
SDO_FILTER
SDO_NN
oracle.toplink.expressions.spatial.SpatialExpressionFactoryクラスの次のメソッドを使用して、空間演算子を使用する式を作成します。
withinDistance
relate
filter
nearestNeighbor
これらすべてのメソッドに次の共通パラメータ・セットがあります。
JGeometryを指す式(oracle.toplink.expressions.Expression)
JGeometryオブジェクトまたはExpression
ファンクション・コールに対するパラメータを定義するoracle.toplink.expressions.spatial.SpatialParametersオブジェクト
SpatialParametersクラスは、次のものを表すパラメータを設定できる簡便メソッドを用意しています。
最小解像度
最大解像度
ユニット
距離
問合せのタイプ
マスク
パラメータのString
例112-1は、空間演算子式を作成し、Stringを使用して作成されたSpatialParametersで既存のJGeometryに関連付ける方法を示します。
例112-1 SpatialParametersのStringを使用した式の関連付け
SpatialParameters parameters =
new SpatialParameters("MASK=ANYINTERACT QUERYTYPE=WINDOW");
Expression selectionCriteria =
SpatialExpressionFactory.relate(expressionBuilder.get("geometry"),
rectangle,
parameters);
例112-2は、簡便メソッドを使用して作成されたSpatialParametersで2つの式を関連付ける方法を示します。
例112-2 2つの式の関連付け
SpatialParameters parameters = new SpatialParameters();
parameters.setQueryType(
SpatialParameters.QueryType.WINDOW.setMask(Mask.ANYINTERACT);
Expression selectionCriteria =
SpatialExpressionFactory.relate(expressionBuilder1.get("geometry"),
expressionBuilder2.get("geometry"),
parameters);