:_basedir: 
:_imagesdir: images/
:grid: cols
:query:

[[index]]

== JDOQL : Methodsanchor:JDOQL_:_Methods[]

When writing the "filter" for a JDOQL Query you can make use of some
methods on the various Java types. The range of methods included as
standard in JDOQL is not as flexible as with the true Java types, but
the ones that are available are typically of much use.

{empty} +


=== String Methodsanchor:String_Methods[]

[cols=",",options="header",]
|===
|Method |Description
|startsWith(String) |Returns if the string starts with the passed string

|startsWith(String, int) |Returns if the string starts with the passed
string, after the specified position

|endsWith(String) |Returns if the string ends with the passed string

|indexOf(String) |Returns the first position of the passed string

|indexOf(String, int) |Returns the position of the passed string, after
the passed position

|substring(int) |Returns the substring starting from the passed position

|substring(int, int) |Returns the substring between the passed positions

|toLowerCase() |Returns the string in lowercase

|toUpperCase() |Returns the string in UPPERCASE

|matches(String pattern) |Returns whether string matches the passed
expression. The pattern argument follows the rules of
java.lang.String.matches method.

|trim() |Returns the string with leading/trailing spaces trimmed

|length() |Returns the length of the string

|charAt(int) |Returns the character at the specified position of the
string
|===

Here's an example using a Product class, looking for objects whose
abbreviation is the beginning of a trade name. The trade name is provided
as parameter.

....
Declarative JDOQL :
Query query = pm.newQuery(mydomain.Product.class);
query.setFilter(":tradeName.startsWith(this.abbreviation)");
List results = (List)query.execute("Workbook Advanced");

Single-String JDOQL :
Query query = pm.newQuery(
    "SELECT FROM mydomain.Product " +
    "WHERE :tradeName.startsWith(this.abbreviation)");
List results = (List)query.execute("Workbook Advanced");
....

{empty} +


Here's another example, demonstrating the "matches" method. Consult the
javadocs for Java regular expressions for the syntax of the matches
input.

....
Declarative JDOQL :
Query query = pm.newQuery(mydomain.Product.class);
query.setFilter("this.abbreviation.matches(\"a*b\")");
List results = (List)query.execute();

Single-String JDOQL :
Query query = pm.newQuery(
    "SELECT FROM mydomain.Product " +
    "WHERE this.abbreviation.matches(\"a*b\")");
List results = (List)query.execute();
....

{empty} +


=== Collection Methodsanchor:Collection_Methods[]

[cols=",",options="header",]
|===
|Method |Description
|isEmpty() |Returns whether the collection is empty

|contains(value) |Returns whether the collection contains the passed
element

|size() |Returns the number of elements in the collection
|===

Here's an example demonstrating use of contains(). We have an Inventory
class that has a Collection of Product objects, and we want to find the
Inventory objects with 2 particular Products in it. Here we make use of
a variable (_prd_ to represent the Product being contained

....
Declarative JDOQL :
Query query = pm.newQuery(mydomain.Inventory.class);
query.setFilter("products.contains(prd) && (prd.name==\"product 1\" || prd.name==\"product 2\")");
List results = (List)query.execute();

Single-String JDOQL:
Query query = pm.newQuery(
    "SELECT FROM mydomain.Inventory EXCLUDE SUBCLASSES " + 
    "WHERE products.contains(prd) && (prd.name==\"product 1\" || prd.name==\"product 2\")");
List results = (List)query.execute();
....

{empty} +


=== List Methodsanchor:List_Methods[]

[cols=",",options="header",]
|===
|Method |Description
|get(position) |Returns the element at that position in the List
(JDO3.1)
|===

{empty} +


=== Map Methodsanchor:Map_Methods[]

[cols=",",options="header",]
|===
|Method |Description
|isEmpty() |Returns whether the map is empty
|containsKey(key) |Returns whether the map contains the passed key
|containsValue(value) |Returns whether the map contains the passed value
|get(key) |Returns the value from the map with the passed key
|size() |Returns the number of entries in the map
|===

Here's an example using a Product class as a value in a Map. Our example
represents an organisation that has several Inventories of products.
Each Inventory of products is stored using a Map, keyed by the Product
name. The query searches for all Inventories that contain a product with
the name "product 1".

....
Declarative JDOQL :
Query query = pm.newQuery(mydomain.Inventory.class, "products.containsKey(\"product 1\")");
List results = (List)query.execute();

Single-String JDOQL :
Query query = pm.newQuery(
    "SELECT FROM mydomain.Inventory EXCLUDE SUBCLASSES " +
    "WHERE products.containsKey(\"product 1\")");
List results = (List)query.execute();
....

{empty} +


=== Temporal Methodsanchor:Temporal_Methods[]

[cols=",",options="header",]
|===
|Method |Description
|getDay() |Returns the day of the month
|getMonth() |Returns the month of the year
|getYear() |Returns the year
|getHour() |Returns the hour
|getMinute() |Returns the minute
|getSecond() |Returns the second
|===

{empty} +


=== Enum Methodsanchor:Enum_Methods[]

[cols=",",options="header",]
|===
|Method |Description
|ordinal() |Returns the ordinal of the enum
|toString() |Returns the string form of the enum
|===

{empty} +


=== Other Methodsanchor:Other_Methods[]

[cols=",",options="header",]
|===
|Method |Description
|Math.abs(number) |Returns the absolute value of the passed number

|Math.sqrt(number) |Returns the square root of the passed number

|Math.cos(number) |Returns the cosine of the passed number

|Math.sin(number) |Returns the sine of the passed number

|Math.tan(number) |Returns the tangent of the passed number

|JDOHelper.getObjectId(object) |Returns the object identity of the
passed persistent object

|JDOHelper.getVersion(object) |Returns the version of the passed
persistent object
|===

