11.2.3.2. Red Hat Data Grid Query DSL
Red Hat Data Grid は、Lucene および Hibernate Search からは独立して独自のクエリー DSL を提供します。基礎となるクエリーおよびインデックス化メカニズムからクエリー API を切り離すことで、今後新しい代替エンジンを導入でき、Lucene 以外にも、同じ統一されたクエリー API を使用できます。インデックス化と検索の現在の実装は、Hibernate Search および Lucene をベースとしているため、本章で紹介しているインデックス関連の要素はすべて適用されます。
新しい API は、Lucene クエリーオブジェクトを構築する低レベル詳細にユーザーを公開せずにクエリーの書き込みを簡素化し、remote Hot クライアントに利用可能な利点があります。しかし、より詳細な詳細を解決する前に、まず前の例から Book エンティティーのクエリーを記述する簡単な例を確認してください。
Red Hat Data Grid のクエリー DSL を使用したクエリー例
API は org.infinispan.query.dsl パッケージにあります。クエリーは、キャッシュごとの SearchManager から取得する QueryFactory インスタンスを使って作成されます。各 QueryFactory インスタンスは SearchManager と同じ Cache インスタンスにバインドされますが、複数のクエリーを並行して作成するために使用されるステートレスおよびスレッドセーフオブジェクトです。
クエリーの作成は、from(Class entityType) メソッドの呼び出しから始まります。これは、指定のキャッシュから指定のエンティティークラスにターゲットが設定されるクエリーを作成する QueryBuilder オブジェクトを返します。
クエリーは常に単一のエンティティータイプをターゲットにし、単一のキャッシュの内容に対して評価されます。複数のキャッシュでクエリを実行したり、複数のエンティティタイプ(結合)を対象とするクエリを作成したりすることは、サポートされていません。
QueryBuilder は、DSL メソッドの呼び出しを通じて指定された検索条件と設定を累積し、構築を完了する Query Builder.build()メソッドの呼び出しによって Query オブジェクトをビルド するために使用されます。ステートフルなオブジェクトの場合、これは同時に複数のクエリーを構築するのに使用できません( ネストされたクエリーを除く)。ただし、後で再利用できます。
この QueryBuilder は Hibernate Search とは異なりますが、同じ名前になります。曖昧さを防ぐために、今後名前を変更することを検討しています。
クエリーを実行し、結果の取得は、Query オブジェクトの list() メソッドを呼び出すのと同じくらい簡単です。実行すると、Query オブジェクトは再利用できません。新しい結果を取得するために新しい結果を再実行する必要がある場合は、QueryBuilder.build() を呼び出すことで新しいインスタンスを取得する必要があります。
11.2.3.2.1. Operator のフィルタリング リンクのコピーリンクがクリップボードにコピーされました!
クエリーの構築は、複数の基準を構成する階層プロセスであり、この階層に従って説明するのが最適です。
クエリー基準の最も単純な形式は、ゼロ以上の引数を許可するフィルター演算子に従ってエンティティー属性の値の制限です。entity 属性は、利用可能なすべての演算子を公開する中間コンテキストオブジェクト(FilterConditionEndContext)を返すクエリービルダーの having(String attributePath) メソッドを呼び出して指定されます。FilterConditionEndContext で定義される各メソッドは、2 つの引数を持ち、引数のない isNull を除く、引数を受け入れる演算子です。引数はクエリーが構築される際に静的に評価されます。そのため、SQL の相関サブクィーストと同様の機能を探す場合、これが現在利用できません。
// a single query criterion
QueryBuilder qb = ...
qb.having("title").eq("Hibernate Search in Action");
// a single query criterion
QueryBuilder qb = ...
qb.having("title").eq("Hibernate Search in Action");
| フィルター | 引数 | 説明 |
|---|---|---|
| in | コレクションの値 | 左のオペランドが引数として指定された値のコレクションからの要素のいずれかと等しいことを確認します。 |
| in | Object… 値 | 左のオペランドが、引数として指定される値の(固定)一覧と等しくなることを確認します。 |
| contains | オブジェクト値 | 左側の引数(配列またはコレクション)に指定の要素が含まれることを確認します。 |
| containsAll | コレクションの値 | 左の引数(配列またはコレクション)に指定のコレクションのすべての要素が任意の順序で含まれていることを確認します。 |
| containsAll | Object… 値 | 左の引数(配列またはコレクション)に指定の全要素が任意の順序で含まれていることを確認します。 |
| containsAny | コレクションの値 | 左側の引数(配列またはコレクション)に指定のコレクションの要素が含まれていることを確認します。 |
| containsAny | Object… 値 | 左側の引数(配列またはコレクション)に指定の要素が含まれることを確認します。 |
| isNull | 左側の引数が null であることを確認します。 | |
| like | 文字列パターン | (文字列として想定される) 左側の引数が、JPA ルールに準拠するワイルドカードパターンと一致することを確認します。 |
| eq | オブジェクト値 | 左側の引数が指定された値と同じであることを確認します。 |
| equal | オブジェクト値 | eq のエイリアス。 |
| gt | オブジェクト値 | 左側の引数が指定の値よりも大きいことを確認します。 |
| gte | オブジェクト値 | 左側の引数が指定の値以上であることを確認します。 |
| lt | オブジェクト値 | 左側の引数が指定の値未満であることを確認します。 |
| LTE | オブジェクト値 | 左側の引数が指定の値以下であることを確認します。 |
| between | オブジェクトからオブジェクト | 左側の引数が指定された範囲の制限の間にあることを確認します。 |
クエリー構築には、適切なシーケンスで実行する必要があるメソッド呼び出しの複数ステップチェーンが必要であり、適切に完了しなければならず、2 回目に実行しないようにしてください。そうでない場合にはエラーが生じます。以下の例は無効であり、それぞれのケースによって基準が無視され(無害なケース)、または例外がスローされます(より深刻なケース)。