11.2.3.2.11. 名前付きクエリーパラメーターの使用
実行ごとに新しいQueryオブジェクトを作成する代わりに、実行前に実際の値に置き換えることができる名前付きパラメーターをクエリに含めることができます。これにより、クエリーを 1 度定義し、複数回効率的に実行できます。パラメーターは Operator の右側でのみ使用でき、通常の定数値ではなく、org.infinispan.query.dsl.Expression.param(String paramName) メソッドによって生成されたオブジェクトを Operator に指定すると、クエリーが作成されたときに定義されます。パラメーターを定義したら、以下の例にあるように Query.setParameter(parameterName, value) または Query.setParameters(parameterMap) を呼び出すことで設定できます。
import org.infinispan.query.Search;
import org.infinispan.query.dsl.*;
[...]
QueryFactory queryFactory = Search.getQueryFactory(cache);
// Defining a query to search for various authors and publication years
Query query = queryFactory.from(Book.class)
.select("title")
.having("author").eq(Expression.param("authorName"))
.and()
.having("publicationYear").eq(Expression.param("publicationYear"))
.build();
// Set actual parameter values
query.setParameter("authorName", "Doe");
query.setParameter("publicationYear", 2010);
// Execute the query
List<Book> found = query.list();
または、実際のパラメーター値のマッピングを指定して、複数のパラメーターを 1 度に設定できます。
複数の名前付きパラメーターを一度に設定する
import java.util.Map;
import java.util.HashMap;
[...]
Map<String, Object> parameterMap = new HashMap<>();
parameterMap.put("authorName", "Doe");
parameterMap.put("publicationYear", 2010);
query.setParameters(parameterMap);
クエリーの解析、検証、および実行計画の作業の大部分は、パラメーターでのクエリーの最初の実行時に実行されます。この作業は後続の実行時には繰り返し行われないため、クエリーパラメーターではなく定数値を使用した同様のクエリーの場合よりもパフォーマンスが向上します。