Chapter 15. Annotating Objects and Querying
15.1. Annotating Objects and Querying
Once indexing has been enabled, custom objects being stored in Red Hat JBoss Data Grid need to be assigned appropriate annotations.
As a basic requirement, all objects required to be indexed must be annotated with
-
@Indexed
In addition, all fields within the object that will be searched need to be annotated with @Field.
Annotating Objects with @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;
}
For other annotations and options, see Mapping Domain Objects to the Index Structure.
When using JBoss EAP modules with JBoss Data Grid with the domain model as a module, add the org.infinispan.query dependency with slot 7.1 into the module.xml file. The custom annotations are not picked by the queries without the org.infinispan.query dependency and results in an error.
15.2. Registering a Transformer via Annotations
The key for each value must also be indexed, and the key instance must then be transformed in a String.
Red Hat JBoss Data Grid includes some default transformation routines for encoding common primitives, however to use a custom key you must provide an implementation of org.infinispan.query.Transformer.
The following example shows how to annotate your key type using org.infinispan.query.Transformer:
Annotating the Key Type
@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();
}
}
The two methods must implement a biunique correspondence.
For example, for any object A the following must be true:
Biunique Correspondence
A.equals(transformer.fromString(transformer.toString(A));
This assumes that the transformer is the appropriate Transformer implementation for objects of type A.
15.3. Querying Example
The following provides an example of how to set up and run a query in Red Hat JBoss Data Grid.
In this example, the Person object has been annotated using the following:
Annotating the Person Object
@Indexed
public class Person implements Serializable {
@Field(store = Store.YES)
private String name;
@Field
private String description;
@Field(store = Store.YES)
private int age;
}
Assuming several of these Person objects have been stored in JBoss Data Grid, they can be searched using querying. The following code creates a SearchManager and QueryBuilder instance:
Creating the SearchManager and QueryBuilder
SearchManager manager = Search.getSearchManager(cache);
QueryBuilder builder = manager.buildQueryBuilderForClass(Person.class) .get();
Query luceneQuery = builder.keyword()
.onField("name")
.matching("FirstName")
.createQuery();
The SearchManager and QueryBuilder are used to construct a Lucene query. The Lucene query is then passed to the SearchManager to obtain a CacheQuery instance:
Running the Query
CacheQuery query = manager.getQuery(luceneQuery);
List<Object> results = query.list();
for (Object result : results) {
System.out.println("Found " + result);
}
This CacheQuery instance contains the results of the query, and can be used to produce a list or it can be used for repeat queries.

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.