第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.2org.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 および QueryBuilderLucene クエリーの構築に使用されます。Lucene クエリーは CacheQuery インスタンスを取得するために SearchManager に渡されます。

クエリーの実行

CacheQuery query = manager.getQuery(luceneQuery);
List<Object> results = query.list();
for (Object result : results) {
    System.out.println("Found " + result);
}

この CacheQuery インスタンスにはクエリーの結果が含まれ、リストの作成やクエリーの繰り返しに使用できます。