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 を使用したクエリー例

import org.infinispan.query.dsl.*;

// get the DSL query factory from the cache, to be used for constructing the Query object:
QueryFactory qf = org.infinispan.query.Search.getQueryFactory(cache);

// create a query for all the books that have a title which contains "engine":
org.infinispan.query.dsl.Query query = qf.from(Book.class)
      .having("title").like("%engine%")
      .build();

// get the results:
List<Book> list = query.list();
Copy to Clipboard Toggle word wrap

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");
Copy to Clipboard Toggle word wrap
Expand
表11.1 FilterConditionEndContext は以下のフィルター Operator を公開します。
フィルター引数説明

in

コレクションの値

左のオペランドが引数として指定された値のコレクションからの要素のいずれかと等しいことを確認します。

in

Object…​ 値

左のオペランドが、引数として指定される値の(固定)一覧と等しくなることを確認します。

contains

オブジェクト値

左側の引数(配列またはコレクション)に指定の要素が含まれることを確認します。

containsAll

コレクションの値

左の引数(配列またはコレクション)に指定のコレクションのすべての要素が任意の順序で含まれていることを確認します。

containsAll

Object…​ 値

左の引数(配列またはコレクション)に指定の全要素が任意の順序で含まれていることを確認します。

containsAny

コレクションの値

左側の引数(配列またはコレクション)に指定のコレクションの要素が含まれていることを確認します。

containsAny

Object…​ 値

左側の引数(配列またはコレクション)に指定の要素が含まれることを確認します。

isNull

 

左側の引数が null であることを確認します。

like

文字列パターン

(文字列として想定される) 左側の引数が、JPA ルールに準拠するワイルドカードパターンと一致することを確認します。

eq

オブジェクト値

左側の引数が指定された値と同じであることを確認します。

equal

オブジェクト値

eq のエイリアス。

gt

オブジェクト値

左側の引数が指定の値よりも大きいことを確認します。

gte

オブジェクト値

左側の引数が指定の値以上であることを確認します。

lt

オブジェクト値

左側の引数が指定の値未満であることを確認します。

LTE

オブジェクト値

左側の引数が指定の値以下であることを確認します。

between

オブジェクトからオブジェクト

左側の引数が指定された範囲の制限の間にあることを確認します。

クエリー構築には、適切なシーケンスで実行する必要があるメソッド呼び出しの複数ステップチェーンが必要であり、適切に完了しなければならず、2 回目に実行しないようにしてください。そうでない場合にはエラーが生じます。以下の例は無効であり、それぞれのケースによって基準が無視され(無害なケース)、または例外がスローされます(より深刻なケース)。

// Incomplete construction. This query does not have any filter on "title" attribute yet,
// although the author may have intended to add one.
QueryBuilder qb1 = ...
qb1.having("title");
Query q1 = qb1.build(); // consequently, this query matches all Book instances regardless of title!

// Duplicated completion. This results in an exception at run-time.
// Maybe the author intended to connect two conditions with a boolean operator,
// but this does NOT actually happen here.
QueryBuilder qb2 = ...
qb2.having("title").like("%Data Grid%");
qb2.having("description").like("%clustering%");   // will throw java.lang.IllegalStateException: Sentence already started. Cannot use 'having(..)' again.
Query q2 = qb2.build();
Copy to Clipboard Toggle word wrap
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2026 Red Hat
トップに戻る