Title: ObjectIdQuery
(DataObjectUtils API below is available since 1.2M10. SingleObjectQuery, a precursor of ObjectIdQuery, was available since 1.2M9. In 1.2M12 SingleObjectQuery was renamed to ObjectIdQuery)
ObjectIdQuery is a query that selects objects matching an ObjectId. Considering that ObjectId must be unique, the result of such query is a single object or no objects.
Normally if you need to find an object that matches a certain primary key value, you would use DataObjectUtils.objectForPK(DataContext,String,int). This method will look up an object in the cache, and only run a query if it is not yet cached. ObjectIdQuery gives the user more control of the object caching behavior. It supports three possible caching policies:
Policy | Cache Behavior |
---|---|
ObjectIdQuery.CACHE | This policy is similar to DataObjectUtils behavior. If an object is already cached (either at the DataContext or DataDomain level), it is returned, otherwise the fetch is performed. |
(default policy) ObjectIdQuery.CACHE_REFRESH | This policy forces a database fetch. If an object is already cached (either at the DataContext or DataDomain level), cache is refreshed with a new version and a fresh object is included in the result. |
ObjectIdQuery.CACHE_NO_REFRESH | This policy suppresses database fetch. If an object is already cached (either at the DataContext or DataDomain level), query returns this object. Otherwise it returns an empty result. |
An example of getting a guranteed fresh object:
ObjectId id = new ObjectId("Artist", Artist.ARTIST_ID_PK_COLUMN, 55); // this constructor implicitly uses "CACHE_REFRESH" policy, so a fresh object will be returned ObjectIdQuery query = new ObjectIdQuery(id); DataContext context = ... Artist object = (Artist) DataObjectUtils.objectForQuery(context, query);
An example of checking whether an object is already cached:
ObjectId id = new ObjectId("Artist", Artist.ARTIST_ID_PK_COLUMN, 55); ObjectIdQuery query = new ObjectIdQuery(id, false, ObjectIdQuery.CACHE_NO_REFRESH); DataContext context = ... Artist object = (Artist) DataObjectUtils.objectForQuery(context, query); if(object == null) { // not cached } else { // cached }