Program guide > Access data with client applications > Retrive entities and objects (Query API) > Use the ObjectQuery API
Configure an ObjectQuery schema
ObjectQuery relies on schema or shape information to perform semantic checking and to evaluate path expressions. This section describes how to define the schema in XML or programmatically.
Define the schema
The ObjectMap schema is defined in the ObjectGrid deployment descriptor XML or programmatically using the normal eXtreme Scale configuration techniques. For an example on how to create a schema, see Configure an ObjectQuery schema
Schema information describes plain old Java™ objects (POJOs): which attributes they consist of and what types of attributes there might be, whether the attributes are primary key fields, single-valued or multi-valued relationships, or bidirectional relationships. Schema information directs ObjectQuery to use field access or property access.
Queryable attributes
When the schema is defined in the ObjectGrid, the objects in the schema are introspected using reflection to determine which attributes are available for querying. You can query the following attribute types:
- Java primitive types including wrappers
- java.lang.String
- java.math.BigInteger
- java.math.BigDecimal
- java.util.Date
- java.sql.Date
- java.sql.Time
- java.sql.Timestamp
- java.util.Calendar
- byte[]
- java.lang.Byte[]
- char[]
- java.lang.Character[]
- J2SE enum
Embedded serializable types other than those stated previously can also be included in a query result, but cannot be included in the WHERE or FROM clause of the query. Serializable attributes are not navigable.
Attribute types can be excluded from the schema if the type is not serializable, the field or property is static, or the field is transient. Since all map objects must be serializable, the ObjectGrid only includes attributes that can be persisted from the object. Other objects are ignored.
Field attributesWhen the schema is configured to access the object using fields, all serializable, non-transient fields are automatically incorporated into the schema. To select a field attribute in a query, use the field identifier name as it exists in the class definition.
All public, private, protected and package protected fields are included in the schema.
Property attributesWhen the schema is configured to access the object using properties, all serializable methods that follow the JavaBeans™ property naming conventions will automatically be incorporated into the schema.
To select a property attribute for the query, use the JavaBeans style property name conventions.
All public, private, protected and package protected properties are included in the schema.
In the following class, the following attributes are added to the schema: name, birthday, valid.
public class Person { public String getName(){} private java.util.Date getBirthday(){} boolean isValid(){} public NonSerializableObject getData(){} }
When using a CopyMode of COPY_ON_WRITE, the query schema must always use property-based access. COPY_ON_WRITE creates proxy objects whenever objects are retrieved from the map and can only access those objects using property methods. Failure to do so will result in each query result being set to null.
Relationships
Each relationship must be explicitly defined in the schema configuration. The cardinality of the relationship is automatically determined by the type of the attribute. If the attribute implements the java.util.Collection interface, then the relationship is either a one-to-many or many-to-many relationship.
Unlike entity queries, attributes that refer to other cached objects must not store direct references to the object. References to other objects are serialized as part of the containing object's data. Instead, store the key to the related object.
For example, if there is a many-to-one relationship between a Customer and Order:
Incorrect. Storing an object reference. public class Customer { String customerId; Collection<Order> orders; } public class Order { String orderId; Customer customer; }
Correct. The key to the related object. public class Customer { String customerId; Collection<String> orders; } public class Order { String orderId; String customer; }
When a query is run that joins the two map objects together, the key will automatically be inflated. For example, the following query would return Customer objects:
SELECT c FROM Order o JOIN Customer c WHERE orderId=5
Use indexes
ObjectGrid uses index plugins to add indexes to maps. The query engine automatically incorporates any indexes that are defined on a schema map element of the type: com.ibm.websphere.objectgrid.plugins.index.HashIndex and the rangeIndex property is set to true. If the index type is not HashIndex and the rangeIndex property is not set to true, then the index is ignored by the query. See Object Query tutorial for an example on how to add an index to the schema.
Parent topic:
Use the ObjectQuery API