ObjectQuery se basa en información de esquema o de forma para realizar la comprobación semántica y evaluar expresiones path. En este apartado se describe cómo definir el esquema en el archivo XML o mediante programación.
El esquema ObjectMap se define en el archivo XML de descriptor de despliegue ObjectGrid o mediante programación con las técnicas normales de configuración de eXtreme Scale. Para obtener un ejemplo de cómo crear un esquema, consulte el apartado Configuración de un esquema ObjectQuery
La información del esquema describe los objetos POJO (plain old Java object): los atributos de los que se compone y los tipos de atributos, si los atributos son campos de clave primaria, relaciones de un valor o de varios valores o relaciones bidireccionales. La información de esquema indica a ObjectQuery que use el acceso de campos o el acceso de propiedades.
Los tipos serializables incorporados distintos de los mencionados anteriormente también pueden incluirse en un resultado de la consulta, pero no pueden incluirse en la cláusula WHERE o FROM de la consulta. Los atributos serializables no son navegables.
Los tipos de atributo pueden excluirse del esquema si el tipo no es serializable, el campo o propiedad es estático o el campo es transitorio. Puesto que todos los objetos de correlación se deben serializar, el ObjectGrid sólo incluye atributos que se pueden persistir en el objeto. Los otros objetos se pasan por alto.
Atributos de campos
Cuando el esquema se configura para acceder al objeto mediante campos, todos los campos serializables, no transitorios se incorporan automáticamente al esquema. Para seleccionar un atributo de campo en una consulta, utilice el nombre del identificador de campo tal y como existe en la definición de clase.
Todos los campos protegidos, protegidos por paquetes, públicos y privados se incluyen en el esquema.
Atributos de propiedades
Cuando el esquema se configura para acceder al objeto mediante propiedades, todos los métodos serializables que siguen los convenios de denominación de la propiedad JavaBeans se incorporarán automáticamente en el esquema. Para seleccionar un atributo de propiedad para la consulta, utilice los convenios de denominación de propiedad del estilo JavaBeans.
Todas las propiedades protegidas, protegidas por paquetes, públicas y privadas se incluyen en el esquema.
En la clase siguiente, se han añadido al esquema estos atributos: name, birthday, valid.
public class Person {
public String getName(){}
private java.util.Date getBirthday(){}
boolean isValid(){}
public NonSerializableObject getData(){}
}
Si se utiliza CopyMode de COPY_ON_WRITE, el esquema de la consulta siempre debe utilizar el acceso basado en la propiedad. COPY_ON_WRITE crea objetos proxy siempre que los objetos se recuperen de la correlación y sólo puede acceder a dichos objetos mediante los métodos de propiedad. Si no se hace de esa manera, cada resultado de la consulta se establecerá en el valor nulo.
Cada relación se debe definir explícitamente en la configuración del esquema. El tipo de atributo determina automáticamente la cardinalidad de la relación. Si el atributo implementa la interfaz java.util.Collection, la relación es una relación de uno a muchos o de muchos a muchos.
A diferencia de las consultas de entidad, los atributos que se refieren a otros objetos almacenados en memoria caché no deben almacenar referencias directas al objeto. Las referencias a otros objetos se serializan como parte de los datos del objeto que contienen. Almacene la clave para el objeto relacionado.
Por ejemplo, si hay una relación de muchos a uno entre Customer y Order:
Incorrecto.
Almacenar una referencia de objeto.
public class Customer {
String customerId;
Collection<Order> orders;
}
public class Order {
String orderId;
Customer customer;
}
Correcto. Clave para el objeto relacionado.
public class Customer {
String customerId;
Collection<String> orders;
}
public class Order {
String orderId;
String customer;
}
Cuando se ejecuta una consulta que une dos objetos de correlación, la clave se infla automáticamente. Por ejemplo, la consulta siguiente devuelve objetos Customer:
SELECT c FROM Order o JOIN Customer c WHERE orderId=5
ObjectGrid utiliza plug-ins de índice para añadir índices a correlaciones. El motor de consultas incorpora automáticamente los índices definidos en un elemento de correlación de esquemas del tipo: com.ibm.websphere.objectgrid.plugins.index.HashIndex y la propiedad rangeIndex se establece en true. Si el tipo de índice no es HashIndex y la propiedad rangeIndex no se establece en true, la consulta pasa por alto el índice. Consulte Guía de aprendizaje de ObjectQuery - Paso 2 para ver un ejemplo sobre cómo añadir un índice al esquema.