第18章 オブジェクトのアノテーション付けおよびクエリー
18.1. オブジェクトのアノテーション付けおよびクエリー
インデックス化が有効になったら、Red Hat JBoss Data Grid に保存されたカスタムオブジェクトに適切なアノテーションを割り当てる必要があります。
基本的な要件として、インデックス化されるすべてのオブジェクトに以下のアノテーションを付ける必要があります。
-
@Indexed
さらに、検索されるオブジェクト内のすべてのフィールドに @Field
アノテーションを付ける必要があります。
@Field アノテーションをオブジェクトに追加
@Indexed public class Person implements Serializable { @Field(store = Store.YES) private String name; @Field(store = Store.YES) private String description; @Field(store = Store.YES) private int age; }
その他のアノテーションおよびオプションについては、「ドメインオブジェクトのインデックス構造へのマッピング」を参照してください。
JBoss EAP モジュールを JBoss Data Grid と使用し、ドメインモデルをモジュールとして使用する場合、スロット 7.2
の org.infinispan.query 依存関係を module.xml ファイルに追加します。org.infinispan.query 依存関係がないと、カスタムアノテーションはクエリーによって取得されず、エラーが発生します。
18.2. アノテーションによるトランスフォーマーの登録
各値のキーもインデックス化する必要があり、キーインスタンスを文字列に変換する必要があります。
Red Hat JBoss Data Grid には共通のプリミティブをエンコードするためにデフォルトのトランスメーションルーティングが一部含まれていますが、カスタムキーを使用するには org.infinispan.query.Transformer
の実装を提供する必要があります。
以下の例は、org.infinispan.query.Transformer
を使用してキータイプにアノテーションを付ける方法を示しています。
キータイプのアノテーション付け
@Transformable(transformer = CustomTransformer.class) public class CustomKey { } public class CustomTransformer implements Transformer { @Override public Object fromString(String s) { return new CustomKey(...); } @Override public String toString(Object customType) { CustomKey ck = (CustomKey) customType; return ck.toString(); } }
2 つのメソッドは 1 対 1 の対応関係 (Biunique correspondence) を実装する必要があります。
たとえば、オブジェクト A は以下が true である必要があります。
1 対 1 の対応関係 (Biunique correspondence)
A.equals(transformer.fromString(transformer.toString(A));
これは、トランスフォーマーはタイプ A のオブジェクトの適切なトランスフォーマー実装であることを前提とします。
18.3. クエリーの例
以下は、Red Hat JBoss Data Grid でクエリーを設定および実行する方法の例になります。
この例では、Person
オブジェクトは以下を使用してアノテーションが付けられています。
Person オブジェクトのアノテーション付け
@Indexed public class Person implements Serializable { @Field(store = Store.YES) private String name; @Field private String description; @Field(store = Store.YES) private int age; }
複数の Person
オブジェクトが JBoss Data Grid に保存されていることを前提とした場合、クエリーを使用してこれらのオブジェクトを検索できます。以下のコードは SearchManager
および QueryBuilder
インスタンスを作成します。
SearchManager
および QueryBuilder
の作成
SearchManager manager = Search.getSearchManager(cache); QueryBuilder builder = manager.buildQueryBuilderForClass(Person.class) .get(); Query luceneQuery = builder.keyword() .onField("name") .matching("FirstName") .createQuery();
The SearchManager
および QueryBuilder
は Lucene
クエリーの構築に使用されます。Lucene
クエリーは CacheQuery
インスタンスを取得するために SearchManager
に渡されます。
クエリーの実行
CacheQuery query = manager.getQuery(luceneQuery); List<Object> results = query.list(); for (Object result : results) { System.out.println("Found " + result); }
この CacheQuery
インスタンスにはクエリーの結果が含まれ、リストの作成やクエリーの繰り返しに使用できます。