javax.jdo.Query Maven / Gradle / Ivy
Show all versions of jdo-api Show documentation
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * Query.java * */ package javax.jdo; import java.io.Serializable; import java.util.Collection; import java.util.Map; /** The
or *Query
interface allows applications to obtain persistent * instances, values, and aggregate data * from the data store. * * The {@link PersistenceManager} is the factory forQuery
* instances. There may be manyQuery
instances associated with a *PersistenceManager
. Multiple queries might be executed * simultaneously by different threads, but the implementation might choose to * execute them serially. In either case, the implementation must be thread * safe. * *There are three required elements in a
Query
: the class of * the results, the candidate collection of instances, and the filter. * *There are optional elements: parameter declarations, variable * declarations, import statements, ordering and grouping specifications, * result and result class, the range of results, * and flags indicating whether the query result * is unique and whether the query can be modified. *
The query namespace is modeled after methods in Java: *
*
*setClass
corresponds to the class definition *declareParameters
corresponds to formal parameters of a * method *declareVariables
corresponds to local variables of a method *setFilter
andsetOrdering
correspond to the * method body *There are two namespaces in queries. Type names have their own * namespace that is separate from the namespace for fields, variables * and parameters. *
The method
setClass
introduces the name of the candidate * class in the type namespace. The methoddeclareImports
* introduces the names of the imported class or interface types in the type * namespace. Imported type names must be unique. When used (e.g. in a parameter * declaration, cast expression, etc.) a type name must be the name of the * candidate class, the name of a class or interface imported by method *declareImports
, or denote a class or interface from the same * package as the candidate class. *The method
setClass
introduces the names of the candidate * class fields. *The method
declareParameters
introduces the names of the * parameters. A name introduced bydeclareParameters
hides the * name of a candidate class field of the same name. Parameter names must be * unique. *The method
declareVariables
introduces the names of the * variables. A name introduced bydeclareVariables
hides the name * of a candidate class field if equal. Variable names must be unique and must * not conflict with parameter names. *The result of the query by default is a list of result class instances, * but might be specified via
setResult
. The class of the result * by default is the candidate class, but might be specified via *setResultClass
. *A hidden field may be accessed using the 'this' qualifier: *
this.fieldName
. *The
Query
interface provides methods which execute the query * based on the parameters given. They return a single instance or a *List
of result class instances which the * user can iterate to get results. The signature * of theexecute
methods specifies that they return an *Object
which must be cast to the appropriate result by the user. *Any parameters passed to the
execute
methods are used only * for this execution, and are not remembered for future execution. * @version 2.1 */ public interface Query extends Serializable { /** * The string constant used as the first argument to * {@link PersistenceManager#newQuery(String,Object)} to identify that the * created query should obey the JDOQL syntax and semantic rules. *This is the default query language used when creating a query with any * of the other {@link PersistenceManager#newQuery} methods, except * {@link PersistenceManager#newQuery(Object)}, which uses the query * language of the compiled query template object passed to that method.
* @since 2.0 */ String JDOQL = "javax.jdo.query.JDOQL"; /** * The string constant used as the first argument to {@link * PersistenceManager#newQuery(String,Object)} to identify that * the created query should use SQL semantics. This is only * meaningful for relational JDO implementations. *If this is used, the
* @since 2.0 */ String SQL = "javax.jdo.query.SQL"; /** Set the class of the candidate instances of the query. *Object
argument to the * {@link PersistenceManager#newQuery(String,Object)} method * should be aString
containing a SQL *SELECT
statement.The class specifies the class * of the candidates of the query. Elements of the candidate collection * that are of the specified class are filtered before being * put into the result
Collection
. * * @param cls theClass
of the candidate instances. */ void setClass(Class cls); /** Set the candidateExtent
to query. * @param pcs the candidateExtent
. */ void setCandidates(Extent pcs); /** Set the candidateCollection
to query. * @param pcs the candidateCollection
. */ void setCandidates(Collection pcs); /** Set the filter for the query. * *The filter specification is a
String
containing a Boolean * expression that is to be evaluated for each of the instances * in the candidate collection. If the filter is not specified, * then it defaults to "true", which has the effect of filtering * the inputCollection
only for class type. *An element of the candidate collection is returned in the result if: *
*
- it is assignment compatible to the candidate
Class
* of theQuery
; and *- for all variables there exists a value for which the filter * expression evaluates to
true
. *The user may denote uniqueness in the filter expression by * explicitly declaring an expression (for example,
e1 != e2
). *Rules for constructing valid expressions follow the Java * language, except for these differences: *
*
*- Equality and ordering comparisons between primitives and instances * of wrapper classes are valid. *
- Equality and ordering comparisons of
Date
fields and *Date
parameters are valid. *- White space (non-printing characters space, tab, carriage * return, and line feed) is a separator and is otherwise ignored. *
- The assignment operators
=
,+=
, etc. and * pre- and post-increment and -decrement are not supported. Therefore, * there are no side effects from evaluation of any expressions. *- Methods, including object construction, are not supported, except * for
Collection.contains(Object o)
, *Collection.isEmpty()
, *String.startsWith(String s)
, and *String.endsWith(String e)
. Implementations might choose to * support non-mutating method calls as non-standard extensions. *- Navigation through a
null
-valued field, which would * throwNullPointerException
, is treated as if the filter * expression returnedfalse
for the evaluation of the current * set of variable values. Other values for variables might still qualify * the candidate instance for inclusion in the result set. *- Navigation through multi-valued fields (
Collection
* types) is specified using a variable declaration and the *Collection.contains(Object o)
method. *Identifiers in the expression are considered to be in the name * space of the specified class, with the addition of declared imports, * parameters and variables. As in the Java language,
this
is a * reserved word which means the element of the collection being evaluated. *Navigation through single-valued fields is specified by the Java * language syntax of
field_name.field_name....field_name
. *A JDO implementation is allowed to reorder the filter expression * for optimization purposes. * @param filter the query filter. */ void setFilter(String filter); /** Set the import statements to be used to identify the fully qualified * name of variables or parameters. Parameters and unbound variables might * come from a different class from the candidate class, and the names * need to be declared in an import statement to eliminate ambiguity. * Import statements are specified as a
String
with * semicolon-separated statements. *The
String
parameter to this method follows the syntax of * the import statement of the Java language. * @param imports import statements separated by semicolons. */ void declareImports(String imports); /** Declare the list of parameters query execution. * * The parameter declaration is aString
containing one or more * query parameter declarations separated with commas. Each parameter named * in the parameter declaration must be bound to a value when * the query is executed. *The
String
parameter to this method follows the syntax * for formal parameters in the Java language. * @param parameters the list of parameters separated by commas. */ void declareParameters(String parameters); /** Declare the unbound variables to be used in the query. Variables * might be used in the filter, and these variables must be declared * with their type. The unbound variable declaration is a *String
containing one or more unbound variable declarations * separated with semicolons. It follows the syntax for local variables in * the Java language. * @param variables the variables separated by semicolons. */ void declareVariables(String variables); /** Set the ordering specification for the resultCollection
. * The ordering specification is aString
containing one or * more ordering declarations separated by commas. * *Each ordering declaration is the name of the field on which * to order the results followed by one of the following words: * "
ascending
" or "descending
". * *The field must be declared in the candidate class or must be * a navigation expression starting with a field in the candidate class. * *
Valid field types are primitive types except
boolean
; * wrapper types exceptBoolean
;BigDecimal
; *BigInteger
;String
; andDate
. * @param ordering the ordering specification. */ void setOrdering(String ordering); /** Set the ignoreCache option. The default value for this option was * set by thePersistenceManagerFactory
or the *PersistenceManager
used to create thisQuery
. * * The ignoreCache option setting specifies whether the query should execute * entirely in the back end, instead of in the cache. If this flag is set * totrue
, an implementation might be able to optimize the * query execution by ignoring changed values in the cache. For optimistic * transactions, this can dramatically improve query response times. * @param ignoreCache the setting of the ignoreCache option. */ void setIgnoreCache(boolean ignoreCache); /** Get the ignoreCache option setting. * @return the ignoreCache option setting. * @see #setIgnoreCache */ boolean getIgnoreCache(); /** Verify the elements of the query and provide a hint to the query to * prepare and optimize an execution plan. */ void compile(); /** Execute the query and return the filtered Collection. *Cancellation of the query using cancel() will result in JDOQueryInterruptedException * being thrown here * @return the filtered
Collection
. * @see #executeWithArray(Object[] parameters) */ Object execute(); /** Execute the query and return the filteredCollection
. *Cancellation of the query using cancel() will result in JDOQueryInterruptedException * being thrown here * @return the filtered
Collection
. * @see #executeWithArray(Object[] parameters) * @param p1 the value of the first parameter declared. */ Object execute(Object p1); /** Execute the query and return the filteredCollection
. *Cancellation of the query using cancel() will result in JDOQueryInterruptedException * being thrown here * @return the filtered
Collection
. * @see #executeWithArray(Object[] parameters) * @param p1 the value of the first parameter declared. * @param p2 the value of the second parameter declared. */ Object execute(Object p1, Object p2); /** Execute the query and return the filteredCollection
. *Cancellation of the query using cancel() will result in JDOQueryInterruptedException * being thrown here * @return the filtered
Collection
. * @see #executeWithArray(Object[] parameters) * @param p1 the value of the first parameter declared. * @param p2 the value of the second parameter declared. * @param p3 the value of the third parameter declared. */ Object execute(Object p1, Object p2, Object p3); /** Execute the query and return the filteredCollection
. The * query is executed with the parameters set by theMap
values. * EachMap
entry consists of a key which is the name of the * parameter in thedeclareParameters
method, and a value which * is the value used in theexecute
method. The keys in the *Map
and the declared parameters must exactly match or a *JDOUserException
is thrown. *Cancellation of the query using cancel() will result in JDOQueryInterruptedException * being thrown here * @return the filtered
Collection
. * @see #executeWithArray(Object[] parameters) * @param parameters theMap
containing all of the parameters. */ Object executeWithMap (Map parameters); /** Execute the query and return the filteredCollection
. * *The execution of the query obtains the values of the parameters and * matches them against the declared parameters in order. The names * of the declared parameters are ignored. The type of * the declared parameters must match the type of the passed parameters, * except that the passed parameters might need to be unwrapped to get * their primitive values. * *
The filter, import, declared parameters, declared variables, and * ordering statements are verified for consistency. * *
Each element in the candidate
Collection
is examined to * see that it is assignment compatible to theClass
of the * query. It is then evaluated by the Boolean expression of the filter. * The element passes the filter if there exist unique values for all * variables for which the filter expression evaluates totrue
. *Cancellation of the query using cancel() will result in JDOQueryInterruptedException * being thrown here * @return the filtered
Collection
. * @param parameters theObject
array with all of the * parameters. */ Object executeWithArray (Object... parameters); /** Get thePersistenceManager
associated with this *Query
. * *If this
Query
was restored from a serialized form, it has * noPersistenceManager
, and this method returns *null
. * @return thePersistenceManager
associated with this *Query
. */ PersistenceManager getPersistenceManager(); /** Close a query result and release any resources associated with it. The * parameter is the return fromexecute(...)
and might have * iterators open on it. Iterators associated with the query result are * invalidated: they returnfalse
tohasNext()
* and throwNoSuchElementException
tonext()
. * @param queryResult the result ofexecute(...)
on this *Query
instance. */ void close (Object queryResult); /** Close all query results associated with thisQuery
* instance, and release all resources associated with them. The query * results might have iterators open on them. Iterators associated with the * query results are invalidated: * they returnfalse
tohasNext()
and throw *NoSuchElementException
tonext()
. */ void closeAll (); /** * Set the grouping expressions, optionally including a "having" * clause. When grouping is specified, each result expression * must either be an expression contained in the grouping, or an * aggregate evaluated once per group. * * @param group a comma-delimited list of expressions, optionally * followed by the "having" keyword and a boolean expression * @since 2.0 */ void setGrouping (String group); /** * Specify that only the first result of the query should be * returned, rather than a collection. The execute method will * return null if the query result size is 0. * @since 2.0 * @param unique if true, only one element is returned */ void setUnique (boolean unique); /** * Specifies what type of data this query should return. If this * is unset or set tonull
, this query returns * instances of the query's candidate class. If set, this query * will return expressions, including field values (projections) and * aggregate function results. * @param data a comma-delimited list of expressions * (fields, functions on fields, or aggregate functions) * to return from this query * @since 2.0 */ void setResult (String data); /** * Specify the type of object in which to return each element of * the result of invoking {@link #execute} or one of its siblings. * If the result is not set or set to null, the result class defaults * to the candidate class of the query. If the result consists of one * expression, the result class defaults to the type of that expression. * If the result consists of more than one expression, the result class * defaults to Object[]. * The result class may be specified to be one of the java.lang classes * Character, Boolean, Byte, Short, Integer, Long, Float, Double, String, * or Object[]; or one of the java.math classes BigInteger or BigDecimal; * or the java.util class Date; or one of the java.sql classes Date, * Time, or Timestamp; or a user-defined class. *If there are multiple result expressions, the result class * must be able to hold all elements of the result specification * or a JDOUserException is thrown. *
If there is only one result expression, the result class must be * assignable from the type of the result expression or must be able * to hold all elements of the result specification. A single value * must be able to be coerced into the specified result class * (treating wrapper classes as equivalent to their unwrapped * primitive types) or by matching. If the result class does not satisfy * these conditions, a JDOUserException is thrown. *
A constructor of a result class specified in the setResult method * will be used if the results specification matches the parameters * of the constructor by position and type. If more than one constructor * satisfies the requirements, the JDO implementation chooses one of them. * If no constructor satisfies the results requirements, or if the result * class is specified via the setResultClass method, the following * requirements apply: *
*
* Portable result classes do not invoke any persistence behavior * during their no-args constructor or- A user-defined result class must have a no-args constructor and * one or more public
set
orput
methods or * fields. *- Each result expression must match one of: *
*
*- a public field that matches the name of the result expression * and is of the type (treating wrapper types equivalent to primitive * types) of the result expression; *
- or if no public field matches the name and type, a public *
set
or if neither of the above applies,a public method must be found * with the signaturevoid put(Object, Object)
. * During processing of the results, * the first argument is the name of the result expression and * the second argument is the value from the query result. *set
setRange("50, 70");setRange(":from, :to");
or *setRange("50, :to");
. * The execution of the query is * modified to return only a subset of results. If the filter would * normally return 100 instances, and fromIncl is set to 50, and * toExcl is set to 70, then the first 50 results that would have * been returned are skipped, the next 20 results are returned and the * remaining 30 results are ignored. An implementation should execute * the query such that the range algorithm is done at the data store. * @param fromInclToExcl comma-separated fromIncl and toExcl values * @see #setRange(long, long) * @since 2.0 */ void setRange (String fromInclToExcl); /** * Add a vendor-specific extension to this query. The key and value * are not standard. * An implementation must ignore keys that are not recognized. * @param key the key of the extension * @param value the value of the extension * @since 2.0 */ void addExtension (String key, Object value); /** * Set multiple extensions, or use null to clear all extensions. * Map keys and values are not standard. * An implementation must ignore entries that are not recognized. * @param extensions the map of extensions * @see #addExtension * @since 2.0 */ void setExtensions (Map extensions); /** * Returns theFetchPlan
used by this *Query
. Modifications of the returned fetch plan will not * cause this query's owningPersistenceManager
's *FetchPlan
to be modified. * @since 2.0 * @return the fetch plan used by this query */ FetchPlan getFetchPlan (); /** * Deletes all the instances of the candidate class that pass the * filter. * @see #deletePersistentAll() * @param parameters for the query * @return the number of instances of the candidate class that were deleted * @since 2.0 */ long deletePersistentAll (Object... parameters); /** * Deletes all the instances of the candidate class that pass the * filter. * @see #deletePersistentAll() * @param parameters for the query * @return the number of instances of the candidate class that were deleted * @since 2.0 */ long deletePersistentAll (Map parameters); /** * Deletes all the instances of the candidate class that pass the * filter. Returns the number of instances of the candidate * class that were deleted, specifically not including the number * of dependent and embedded instances. *Dirty instances of affected classes in the cache are first * flushed to the datastore. Instances in the cache or brought into * the cache as a result of executing one of the *
deletePersistentAll
* methods undergo life cycle changes as ifdeletePersistent
* were called on them. *Specifically, if the class of deleted instances implements the * delete callback interface, the corresponding callback methods * are called on the deleted instances. Similarly, if there are * lifecycle listeners registered for delete events on affected * classes, the listener is called for each appropriate deleted instance. *
Before returning control to the application, instances of affected * classes in the cache are refreshed to reflect whether they were * deleted from the datastore. * * @return the number of instances of the candidate class that were deleted * @since 2.0 */ long deletePersistentAll (); /** * The unmodifiable flag, when set, disallows further * modification of the query, except for specifying the range, * result class, and ignoreCache option. * The unmodifiable flag can also be set in metadata. * @since 2.0 */ void setUnmodifiable(); /** * The unmodifiable flag, when set, disallows further * modification of the query, except for specifying the range, * result class, and ignoreCache option. * @return the current setting of the flag * @since 2.0 */ boolean isUnmodifiable(); /** * Add a subquery to this query. * @param sub the subquery to add to this Query * @param variableDeclaration the name of the variable in the outer query * to bind the results of the subquery * @param candidateCollectionExpression the candidate collection * of the subquery as an expression using terms of the outer query * @see #addSubquery(Query sub, String variableDeclaration, * String candidateCollectionExpression, String... parameters) * @since 2.1 */ void addSubquery (Query sub, String variableDeclaration, String candidateCollectionExpression); /** * Add a subquery to this query. * The String version of the method binds the named expression * to the parameter implictly or explicitly declared in the * subquery. * @param sub the subquery to add to this Query * @param variableDeclaration the name of the variable * to be used in this Query * @param candidateCollectionExpression the candidate collection * to apply to the subquery * @param parameter the expression from the outer query to bind * the parameter in the subquery * @see #addSubquery(Query sub, String variableDeclaration, * String candidateCollectionExpression, String... parameters) * @since 2.1 */ void addSubquery (Query sub, String variableDeclaration, String candidateCollectionExpression, String parameter); /** * Add a subquery to this query. * A subquery is composed as a Query and subsequently attached * to a different query (the outer query) by calling this method. * The query parameter instance is unmodified as a result of the * addSubquery or subsequent execution of the outer query. * Only some of the query parts are copied for use as the subquery. * The parts copied include the candidate class, filter, parameter * declarations, variable declarations, imports, ordering specification, * uniqueness, result specification, and grouping specification. * The association with a PersistenceManager, the candidate collection * or extent, result class, and range limits are not used. * The String parameters are trimmed of white space. * The variableDeclaration parameter is the name of the variable * containing the results of the subquery execution. If the same value * of variableDeclaration is used to add multiple subqueries, the * subquery replaces the previous subquery for the same named variable. * If the subquery parameter is null, the variable is unset, * effectively making the variable named in the variableDeclaration * unbound. If the trimmed value is the empty String, or the parameter * is null, then JDOUserException is thrown. * The candidateCollectionExpression is the expression from the * outer query that represents the candidates over which the subquery * is evaluated. If the trimmed value is the empty String, or the * parameter is null, then the candidate collection is the extent * of the candidate class. * The String... version of the method binds the named expressions in * turn to parameters in the order in which they are declared in the * subquery, or in the order they are found in the filter if not * explicitly declared in the subquery. * @param sub the subquery to add to this Query * @param variableDeclaration the name of the variable in the outer query * to bind the results of the subquery * @param candidateCollectionExpression the candidate collection * of the subquery as an expression using terms of the outer query * @param parameters the expressions from the outer query to bind * the parameters in the subquery * @since 2.1 */ void addSubquery (Query sub, String variableDeclaration, String candidateCollectionExpression, String... parameters); /** * Add a subquery to this query. * The Map version of the method treats the key of each map entry as * the name of the parameter in the subquery, with or without the * leading ":", and the value as the name of the expression in the * outer query. If the trimmed expression is the empty String for * either the parameter or the value of the String[], or for any * map key or value, that expression is ignored. * @param sub the subquery to add to this Query * @param variableDeclaration the name of the variable * to be used in this Query * @param candidateCollectionExpression the candidate collection * to apply to the subquery * @param parameters the expressions from the outer query to bind * the parameter in the subquery * @see #addSubquery(Query sub, String variableDeclaration, * String candidateCollectionExpression, String... parameters) * @since 2.1 */ void addSubquery (Query sub, String variableDeclaration, String candidateCollectionExpression, Map parameters); /** * Specify a timeout interval (milliseconds) for any read operations * associated with this query. To unset the explicit timeout for this * query, specify null. For no timeout, specify 0. * If the datastore granularity is larger than milliseconds, the * timeout value will be rounded up to the nearest supported datastore * value. * If a read operation hasn't completed within this interval, executeXXX * will throw a JDODatastoreException. * If multiple datastore operations are required to complete the query, * the timeout value applies to each of them individually. * If the datastore and JDO implementation support timeouts, then * javax.jdo.option.DatastoreTimeout is returned by * PersistenceManagerFactory.supportedOptions(). * If timeouts are not supported,this method will throw * JDOUnsupportedOptionException. * @since 3.0 * @param interval the timeout interval (milliseconds) */ void setDatastoreReadTimeoutMillis(Integer interval); /** Get the effective timeout setting for read operations. * If the timeout has not been set on this query explicitly, the effective * datastore read timeout value from the persistence manager is returned. * @see #setDatastoreReadTimeoutMillis(Integer) * @see PersistenceManager#setDatastoreReadTimeoutMillis(Integer) * @return the effective timeout setting (milliseconds). * @since 3.0 */ Integer getDatastoreReadTimeoutMillis(); /** * Specify a timeout interval (milliseconds) for any write operations * associated with this query. To unset the explicit timeout for this * query, specify null. For no timeout, specify 0. * If the datastore granularity is larger than milliseconds, the * timeout value will be rounded up to the nearest supported datastore * value. * If a write operation hasn't completed within this interval, deleteXXX * will throw a JDODatastoreException. * If multiple datastore operations are required to complete the query, * the timeout value applies to each of them individually. * If the datastore and JDO implementation support timeouts, then * javax.jdo.option.DatastoreTimeout is returned by * PersistenceManagerFactory.supportedOptions(). * If timeouts are not supported,this method will throw * JDOUnsupportedOptionException. * @since 3.0 * @param interval the timeout interval (milliseconds) */ void setDatastoreWriteTimeoutMillis(Integer interval); /** Get the effective timeout setting for write operations. * If the timeout has not been set on this query explicitly, the effective * datastore write timeout value from the persistence manager is returned. * @see #setDatastoreWriteTimeoutMillis(Integer) * @see PersistenceManager#setDatastoreWriteTimeoutMillis(Integer) * @return the effective timeout setting (milliseconds). * @since 3.0 */ Integer getDatastoreWriteTimeoutMillis(); /** * Method to cancel any executing queries. * If the underlying datastore doesn't support cancellation of queries this will * throw JDOUnsupportedOptionException. * If the cancellation fails (e.g in the underlying datastore) then this will throw * a JDOException. * @since 3.0 */ void cancelAll(); /** * Method to cancel an executing query in the specified thread. * If the underlying datastore doesn't support cancellation of queries this will * throw JDOUnsupportedOptionException. * If the cancellation fails (e.g in the underlying datastore) then this will throw * a JDOException. * @since 3.0 */ void cancel(Thread thread); /** * If
true
, a lock will be applied to all objects read in this * query. *If
false
then retrieved objects will not be locked. * If null will fallback to the value for metadata for the class in question. * @param serialize the value of the serializeRead property * @since 3.0 */ void setSerializeRead(Boolean serialize); /** * Return the current value of the serializeRead property. * @return the value of the serializeRead property * @since 3.0 */ Boolean getSerializeRead(); }