blob: ec60f2cf946bc5cd2f59f9991a8824e34bb99a4a [file] [log] [blame]
<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- No caching headers -->
<meta http-equiv="cache-control" content="no-cache"/>
<meta http-equiv="pragma" content="no-cache"/>
<meta http-equiv="expires" content="-1"/>
<meta name="keywords" content="JDO, Apache, Java, Data, Objects"/>
<meta name="description" content="Apache JDO - Java Data Objects"/>
<title>JDOQL</title>
<link rel="icon" type="image/png" href="images/JDOx150.png"/>
<!--
Apache JDO Documentation Template
==================================
This template derived various aspects from Apache Deltaspike template, the Apache ISIS template and the Datanucleus template.
This template uses
* Bootstrap v3.3.7 (https://getbootstrap.com/) for navbar.
* Asciidoctor "foundation" CSS
* Bootswatch "cosmo" theme for Bootstrap (https://bootswatch.com/cosmo).
* Bootstrap TOC plugin v0.4.1 (https://afeld.github.io/bootstrap-toc/) for the table of contents.
* jQuery (necessary for Bootstrap's JavaScript plugins)
* Font-Awesome for some icons used by Asciidoctor
NOTE: tried using Font-Awesome CSS hosted locally but then fails to work!
-->
<link href="css/bootswatch/3.3.7/bootstrap-cosmo.css" rel="stylesheet"/>
<link href="css/bootstrap-toc/0.4.1/bootstrap-toc.min.css" rel="stylesheet"/>
<link href="css/asciidoctor/foundation.css" rel="stylesheet"/>
<link href="css/datanucleus_theme.css" rel="stylesheet"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="js/bootstrap/3.3.7/bootstrap.min.js"></script>
<script src="js/bootstrap-toc/0.4.1/bootstrap-toc.min.js"></script>
<!-- Coderay syntax formatter -->
<style type="text/css">
/* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */
pre.CodeRay{background:#f7f7f8}
.CodeRay .line-numbers{border-right:1px solid currentColor;opacity:.35;padding:0 .5em 0 0}
.CodeRay span.line-numbers{display:inline-block;margin-right:.75em}
.CodeRay .line-numbers strong{color:#000}
table.CodeRay{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.CodeRay td{vertical-align:top;line-height:inherit}
table.CodeRay td.line-numbers{text-align:right}
table.CodeRay td.code{padding:0 0 0 .75em}
.CodeRay .debug{color:#fff !important;background:#000080 !important}
.CodeRay .annotation{color:#007}
.CodeRay .attribute-name{color:#000080}
.CodeRay .attribute-value{color:#700}
.CodeRay .binary{color:#509}
.CodeRay .comment{color:#998;font-style:italic}
.CodeRay .char{color:#04d}
.CodeRay .char .content{color:#04d}
.CodeRay .char .delimiter{color:#039}
.CodeRay .class{color:#458;font-weight:bold}
.CodeRay .complex{color:#a08}
.CodeRay .constant,.CodeRay .predefined-constant{color:#008080}
.CodeRay .color{color:#099}
.CodeRay .class-variable{color:#369}
.CodeRay .decorator{color:#b0b}
.CodeRay .definition{color:#099}
.CodeRay .delimiter{color:#000}
.CodeRay .doc{color:#970}
.CodeRay .doctype{color:#34b}
.CodeRay .doc-string{color:#d42}
.CodeRay .escape{color:#666}
.CodeRay .entity{color:#800}
.CodeRay .error{color:#808}
.CodeRay .exception{color:inherit}
.CodeRay .filename{color:#099}
.CodeRay .function{color:#900;font-weight:bold}
.CodeRay .global-variable{color:#008080}
.CodeRay .hex{color:#058}
.CodeRay .integer,.CodeRay .float{color:#099}
.CodeRay .include{color:#555}
.CodeRay .inline{color:#000}
.CodeRay .inline .inline{background:#ccc}
.CodeRay .inline .inline .inline{background:#bbb}
.CodeRay .inline .inline-delimiter{color:#d14}
.CodeRay .inline-delimiter{color:#d14}
.CodeRay .important{color:#555;font-weight:bold}
.CodeRay .interpreted{color:#b2b}
.CodeRay .instance-variable{color:#008080}
.CodeRay .label{color:#970}
.CodeRay .local-variable{color:#963}
.CodeRay .octal{color:#40e}
.CodeRay .predefined{color:#369}
.CodeRay .preprocessor{color:#579}
.CodeRay .pseudo-class{color:#555}
.CodeRay .directive{font-weight:bold}
.CodeRay .type{font-weight:bold}
.CodeRay .predefined-type{color:inherit}
.CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold}
.CodeRay .key{color:#808}
.CodeRay .key .delimiter{color:#606}
.CodeRay .key .char{color:#80f}
.CodeRay .value{color:#088}
.CodeRay .regexp .delimiter{color:#808}
.CodeRay .regexp .content{color:#808}
.CodeRay .regexp .modifier{color:#808}
.CodeRay .regexp .char{color:#d14}
.CodeRay .regexp .function{color:#404;font-weight:bold}
.CodeRay .string{color:#d20}
.CodeRay .string .string .string{background:#ffd0d0}
.CodeRay .string .content{color:#d14}
.CodeRay .string .char{color:#d14}
.CodeRay .string .delimiter{color:#d14}
.CodeRay .shell{color:#d14}
.CodeRay .shell .delimiter{color:#d14}
.CodeRay .symbol{color:#990073}
.CodeRay .symbol .content{color:#a60}
.CodeRay .symbol .delimiter{color:#630}
.CodeRay .tag{color:#008080}
.CodeRay .tag-special{color:#d70}
.CodeRay .variable{color:#036}
.CodeRay .insert{background:#afa}
.CodeRay .delete{background:#faa}
.CodeRay .change{color:#aaf;background:#007}
.CodeRay .head{color:#f8f;background:#505}
.CodeRay .insert .insert{color:#080}
.CodeRay .delete .delete{color:#800}
.CodeRay .change .change{color:#66f}
.CodeRay .head .head{color:#f4f}
</style>
</head>
<body data-spy="scroll" data-target="#toc">
<!-- Navbar -->
<nav class="navbar navbar-default navbar-static-top">
<div class="container">
<div class="navbar-header">
<!-- Three line menu button for use on mobile screens -->
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<!-- 'style' added to align image with navbar. FIX THIS -->
<a class="navbar-brand" href="https://db.apache.org/jdo/">
<img style="margin-top: -12px;" alt="Brand" width="45.5" height="45.5" src="images/JDOx150.png"/>
</a>
<!-- TODO Any way to abstract the version from Maven? -->
<a class="navbar-brand" href="index.html">Apache JDO</a>
</div>
<!-- Navbar that will collapse on mobile screens -->
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="dropdown">
<!-- menu item General -->
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">General<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="why_jdo.html">Why JDO?</a></li>
<li><a href="getting-started.html">Getting Started</a></li>
<li><a href="specifications.html">Specifications</a></li>
<li><a href="tck.html">TCK</a></li>
<li><a href="javadoc.html">API Javadoc</a></li>
<li role="separator" class="divider"></li>
<li><a href="jdo_v_jpa.html">JDO v JPA</a></li>
<li><a href="jdo_v_jpa_api.html">JDO v JPA : API</a></li>
<li><a href="jdo_v_jpa_orm.html">JDO v JPA : ORM</a></li>
<li role="separator" class="divider"></li>
<li><a href="license.html">License</a></li>
<li><a href="impls.html">Implementations</a></li>
<li><a href="jdo_3_0_overview.html">JDO 3.0 Overview</a></li>
<li><a href="references.html">References</a></li>
<li><a href="glossary.html">Glossary</a></li>
</ul>
</li>
<!-- menu item API Usage -->
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">API Usage<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="pmf.html">PersistenceManagerFactory</a></li>
<li><a href="pm.html">PersistenceManager</a></li>
<li><a href="transactions.html">Transactions</a></li>
<li><a href="attach_detach.html">Attach-Detach</a></li>
<li><a href="fetchgroups.html">Fetch Plan/Groups</a></li>
<li><a href="state_transition.html">Object States</a></li>
<li><a href="object_retrieval.html">Object Retrieval</a></li>
<li><a href="exceptions.html">Exceptions</a></li>
<li><a href="jdohelper.html">JDO Helper</a></li>
<li role="separator" class="divider"></li>
<li><a href="guides-replication.html">Data Replication</a></li>
</ul>
</li>
<!-- menu item Types & Metadata -->
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Types &amp; Metadata<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="class_types.html">Types of Classes</a></li>
<li><a href="field_types.html">Types of Fields</a></li>
<li role="separator" class="divider"></li>
<!-- <li class="dropdown-header">Metadata</li> -->
<li><a href="metadata.html">MetaData</a></li>
<li><a href="annotations.html">Annotations</a></li>
<li><a href="jdo_dtd.html">jdo DTD/XSD</a></li>
<li><a href="orm_dtd.html">orm DTD/XSD</a></li>
<li><a href="jdoquery_dtd.html">jdoquery DTD/XSD</a></li>
<li><a href="jdoconfig_dtd.html">jdoconfig DTD/XSD</a></li>
<li role="separator" class="divider"></li>
<li><a href="enhancement.html">Bytecode Enhancement</a></li>
</ul>
</li>
<!-- menu item Query -->
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" style="background-color:#2385c6">Query<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="query_api.html">Query API</a></li>
<li role="separator" class="divider"></li>
<li><a href="jdoql.html">JDOQL</a></li>
<li><a href="jdoql_methods.html">Methods</a></li>
<li><a href="jdoql_result.html">Result</a></li>
<li><a href="jdoql_quickref.pdf">Quick Ref PDF</a></li>
<li><a href="jdoql_typed.html">JDOQL Typed API</a></li>
<li role="separator" class="divider"></li>
<li><a href="query_sql.html">SQL</a></li>
</ul>
</li>
<!-- menu item Community -->
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Community<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="get-involved.html">Get Involved</a></li>
<li><a href="team-list.html">Project Team</a></li>
<li><a href="mail-lists.html">Mailing Lists</a></li>
<li><a href="faq.html">FAQ</a></li>
</ul>
</li>
<!-- menu item Development -->
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Development<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="roadmap.html">RoadMap / TODO</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="source-code.html">Source Code</a></li>
<li><a href="coding-standards.html">Coding Standards</a></li>
<li><a href="issuetracking.html">Issue Tracking</a></li>
</ul>
</li>
</ul>
<!-- 'style' added to fix height of input box. FIX THIS -->
<form class="navbar-form navbar-left" role="search" id="search-form" action="https://www.google.com/search" method="get" style="padding: 1px 15px;">
<div class="form-group">
<input name="sitesearch" value="db.apache.org/jdo" type="hidden">
<input name="q" type="text" class="form-control" placeholder="Search" style="margin-top: 7px; padding: 1px; border-radius: 5px; height: 30px; vertical-align: middle;">
</div>
</form>
</div>
</div>
</nav>
<div class="container">
<div class="row-fluid">
<div class="col-sm-9">
<!-- <div class="page-title">
<h3>JDOQL</h3>
</div>
-->
<div id="doc-content">
<div class="sect1">
<h2 id="JDOQL">JDOQL</h2>
<div class="sectionbody">
<div class="paragraph">
<p>JDO defines ways of querying objects persisted into the datastore.
It provides its own object-based query language (JDOQL).
JDOQL is designed as the Java developers way of having the power of SQL queries, yet retaining the Java object relationship that exist in their application model.
A typical JDOQL query may be set up in one of 2 ways. Here&#8217;s an example.</p>
</div>
<div class="paragraph">
<p>Declarative JDOQL :</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="predefined-type">Query</span> q = pm.newQuery(mydomain.Person.class, <span class="string"><span class="delimiter">&quot;</span><span class="content">lastName == </span><span class="char">\&quot;</span><span class="content">Jones</span><span class="char">\&quot;</span><span class="content"> &amp;&amp; age &lt; age_limit</span><span class="delimiter">&quot;</span></span>);
q.declareParameters(<span class="string"><span class="delimiter">&quot;</span><span class="content">double age_limit</span><span class="delimiter">&quot;</span></span>);
<span class="predefined-type">List</span> results = (<span class="predefined-type">List</span>)q.execute(<span class="float">20.0</span>);</code></pre>
</div>
</div>
<div class="paragraph">
<p>Single-String JDOQL :</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="predefined-type">Query</span> q = pm.newQuery(<span class="string"><span class="delimiter">&quot;</span><span class="content">SELECT FROM mydomain.Person WHERE lastName == </span><span class="char">\&quot;</span><span class="content">Jones</span><span class="char">\&quot;</span><span class="delimiter">&quot;</span></span> +
<span class="string"><span class="delimiter">&quot;</span><span class="content"> &amp;&amp; age &lt; :age_limit PARAMETERS double age_limit</span><span class="delimiter">&quot;</span></span>);
<span class="predefined-type">List</span> results = (<span class="predefined-type">List</span>)q.execute(<span class="float">20.0</span>);</code></pre>
</div>
</div>
<div class="paragraph">
<p>So here in our example we select all "Person" objects with surname of "Jones" and where the persons age is below 20.
The language is intuitive for Java developers, and is intended as their interface to accessing the persisted data model.
As can be seen above, the query is made up of distinct parts.
The class being selected (the SELECT clause in SQL), the filter (which equates to the WHERE clause in SQL),
together with any sorting (the ORDER BY clause in SQL), etc.</p>
</div>
<div class="paragraph">
<p>Before giving details on JDOQL, you can download a quick reference guide <a href="jdoql_quickref.pdf">here</a></p>
</div>
<div class="sect2">
<h3 id="singlestring">Single-String JDOQL</h3>
<div class="paragraph">
<p>In original (declarative) JDOQL (JDO 1.0) it was necessary to specify the component parts (filter, candidate class, ordering, etc)
of the query using the mutator methods on the Query. From JDO 2 onwards you can specify it all in a single string.
This string has to follow a particular pattern, but provides the convenience that many people require.
The pattern to use is as follows</p>
</div>
<div class="literalblock">
<div class="content">
<pre>SELECT [UNIQUE] [&lt;result&gt;] [INTO &lt;result-class&gt;]
[FROM &lt;candidate-class&gt; [EXCLUDE SUBCLASSES]]
[WHERE &lt;filter&gt;]
[VARIABLES &lt;variable declarations&gt;]
[PARAMETERS &lt;parameter declarations&gt;]
[&lt;import declarations&gt;]
[GROUP BY &lt;grouping&gt;]
[ORDER BY &lt;ordering&gt;]
[RANGE &lt;start&gt;, &lt;end&gt;]</pre>
</div>
</div>
<div class="paragraph">
<p>The "keywords" in the query are shown in UPPER CASE but can be in <em>UPPER</em> or <em>lower</em> case.</p>
</div>
<div class="paragraph">
<p>Lets give an example of a query using this syntax</p>
</div>
<div class="literalblock">
<div class="content">
<pre>SELECT UNIQUE FROM org.datanucleus.samples.Employee ORDER BY departmentNumber</pre>
</div>
</div>
<div class="paragraph">
<p>so we form the parts of the query as before, yet here we just specify it all in a single call.</p>
</div>
</div>
<div class="sect2">
<h3 id="Accessing_Fields">Accessing Fields</h3>
<div class="paragraph">
<p>In JDOQL you access fields in the query by referring to the field name.
For example, if you are querying a class called <em>Product</em> and it has a field "price", then you access it like this</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="predefined-type">Query</span> query = pm.newQuery(mydomain.Product.class, <span class="string"><span class="delimiter">&quot;</span><span class="content">price &lt; 150.0</span><span class="delimiter">&quot;</span></span>);</code></pre>
</div>
</div>
<div class="paragraph">
<p>In addition to the persistent fields, you can also access "public static final" fields of any class. You can do this as follows</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="predefined-type">Query</span> query = pm.newQuery(mydomain.Product.class, <span class="string"><span class="delimiter">&quot;</span><span class="content">taxPercent &lt; mydomain.Product.TAX_BAND_A</span><span class="delimiter">&quot;</span></span>);</code></pre>
</div>
</div>
<div class="paragraph">
<p>So this will find all products that include a tax percentage less than some "BAND A" level.
Where you are using "public static final" fields you can either fully-qualify the class name or you can include it in the
"imports" section of the query (see later).</p>
</div>
</div>
<div class="sect2">
<h3 id="Data_types_:_literals">Data types : literals</h3>
<div class="paragraph">
<p>JDOQL supports the following literals: IntegerLiteral, FloatingPointLiteral, BooleanLiteral, CharacterLiteral, StringLiteral, and NullLiteral.</p>
</div>
</div>
<div class="sect2">
<h3 id="Operators_precedence">Operators precedence</h3>
<div class="paragraph">
<p>The following list describes the operator precedence in JDOQL.</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Cast</p>
</li>
<li>
<p>Unary ("~") ("!")</p>
</li>
<li>
<p>Unary ("+") ("-")</p>
</li>
<li>
<p>Multiplicative ("*") ("/") ("%")</p>
</li>
<li>
<p>Additive ("+") ("-")</p>
</li>
<li>
<p>Relational ("&gt;=") ("&gt;") ("&#8656;") ("&lt;") ("instanceof")</p>
</li>
<li>
<p>Equality ("==") ("!=")</p>
</li>
<li>
<p>Boolean logical AND ("&amp;")</p>
</li>
<li>
<p>Boolean logical OR ("|")</p>
</li>
<li>
<p>Conditional AND ("&amp;&amp;")</p>
</li>
<li>
<p>Conditional OR ("||")</p>
</li>
</ol>
</div>
</div>
<div class="sect2">
<h3 id="Concatenation_Expressions">Concatenation Expressions</h3>
<div class="paragraph">
<p>The concatenation operator(+) concatenates a String to either another String or Number.
Concatenations of String or Numbers to null results in null.</p>
</div>
</div>
<div class="sect2">
<h3 id="Example_1_-_Use_of_Explicit_Parameters">Example 1 - Use of Explicit Parameters</h3>
<div class="paragraph">
<p>Here&#8217;s a simple example for finding the elements of a class with a field below a particular threshold level.
Here we pass in the threshold value (<em>limit</em>), and sort the output in order of ascending price.</p>
</div>
<div class="paragraph">
<p>Declarative JDOQL :</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="predefined-type">Query</span> query = pm.newQuery(mydomain.Product.class,<span class="string"><span class="delimiter">&quot;</span><span class="content">price &lt; limit</span><span class="delimiter">&quot;</span></span>);
query.declareParameters(<span class="string"><span class="delimiter">&quot;</span><span class="content">double limit</span><span class="delimiter">&quot;</span></span>);
query.setOrdering(<span class="string"><span class="delimiter">&quot;</span><span class="content">price ascending</span><span class="delimiter">&quot;</span></span>);
<span class="predefined-type">List</span> results = (<span class="predefined-type">List</span>)query.execute(<span class="float">150.00</span>);</code></pre>
</div>
</div>
<div class="paragraph">
<p>Single-String JDOQL :</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="predefined-type">Query</span> query = pm.newQuery(<span class="string"><span class="delimiter">&quot;</span><span class="content">SELECT FROM mydomain.Product WHERE </span><span class="delimiter">&quot;</span></span> +
<span class="string"><span class="delimiter">&quot;</span><span class="content">price &lt; limit PARAMETERS double limit ORDER BY price ASCENDING</span><span class="delimiter">&quot;</span></span>);
<span class="predefined-type">List</span> results = (<span class="predefined-type">List</span>)query.execute(<span class="float">150.00</span>);</code></pre>
</div>
</div>
<div class="paragraph">
<p>For completeness, the class is shown here</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="type">class</span> <span class="class">Product</span>
{
<span class="predefined-type">String</span> name;
<span class="type">double</span> price;
java.util.Date endDate;
...
}</code></pre>
</div>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;jdo&gt;</span>
<span class="tag">&lt;package</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">mydomain</span><span class="delimiter">&quot;</span></span><span class="tag">&gt;</span>
<span class="tag">&lt;class</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">Product</span><span class="delimiter">&quot;</span></span><span class="tag">&gt;</span>
<span class="tag">&lt;field</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">name</span><span class="delimiter">&quot;</span></span><span class="tag">&gt;</span>
<span class="tag">&lt;column</span> <span class="attribute-name">length</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">100</span><span class="delimiter">&quot;</span></span> <span class="attribute-name">jdbc-type</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">VARCHAR</span><span class="delimiter">&quot;</span></span><span class="tag">/&gt;</span>
<span class="tag">&lt;/field&gt;</span>
<span class="tag">&lt;field</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">abreviation</span><span class="delimiter">&quot;</span></span><span class="tag">&gt;</span>
<span class="tag">&lt;column</span> <span class="attribute-name">length</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">20</span><span class="delimiter">&quot;</span></span> <span class="attribute-name">jdbc-type</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">VARCHAR</span><span class="delimiter">&quot;</span></span><span class="tag">/&gt;</span>
<span class="tag">&lt;/field&gt;</span>
<span class="tag">&lt;field</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">price</span><span class="delimiter">&quot;</span></span><span class="tag">/&gt;</span>
<span class="tag">&lt;field</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">endDate</span><span class="delimiter">&quot;</span></span><span class="tag">/&gt;</span>
<span class="tag">&lt;/class&gt;</span>
<span class="tag">&lt;/package&gt;</span>
<span class="tag">&lt;/jdo&gt;</span></code></pre>
</div>
</div>
<div class="paragraph">
<p><br></p>
</div>
</div>
<div class="sect2">
<h3 id="Example_2_-_Use_of_Implicit_Parameters">Example 2 - Use of Implicit Parameters</h3>
<div class="paragraph">
<p>Let&#8217;s repeat the previous query but this time using <em>implicit</em> parameters.</p>
</div>
<div class="paragraph">
<p>Declarative JDOQL :</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="predefined-type">Query</span> query = pm.newQuery(mydomain.Product.class,<span class="string"><span class="delimiter">&quot;</span><span class="content">price &lt; :limit</span><span class="delimiter">&quot;</span></span>);
query.setOrdering(<span class="string"><span class="delimiter">&quot;</span><span class="content">price ascending</span><span class="delimiter">&quot;</span></span>);
<span class="predefined-type">List</span> results = (<span class="predefined-type">List</span>)query.execute(<span class="float">150.00</span>);</code></pre>
</div>
</div>
<div class="paragraph">
<p>Single-String JDOQL :</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="predefined-type">Query</span> query = pm.newQuery(<span class="string"><span class="delimiter">&quot;</span><span class="content">SELECT FROM mydomain.Product WHERE </span><span class="delimiter">&quot;</span></span> +
<span class="string"><span class="delimiter">&quot;</span><span class="content">price &lt; :limit ORDER BY price ASCENDING</span><span class="delimiter">&quot;</span></span>);
<span class="predefined-type">List</span> results = (<span class="predefined-type">List</span>)query.execute(<span class="float">150.00</span>);</code></pre>
</div>
</div>
<div class="paragraph">
<p>So we omitted the declaration of the parameter and just prefixed it with a colon (:).</p>
</div>
</div>
<div class="sect2">
<h3 id="Example_3_-_Comparison_against_Dates">Example 3 - Comparison against Dates</h3>
<div class="paragraph">
<p>Here&#8217;s another example using the same Product class as above, but this
time comparing to a Date field. Because we are using a type in our
query, we need to <em>import</em> it &#8230;&#8203; just like you would in a Java class if
you were using it there.</p>
</div>
<div class="paragraph">
<p>Declarative JDOQL :</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="predefined-type">Query</span> query = pm.newQuery(domain.Product.class,
<span class="string"><span class="delimiter">&quot;</span><span class="content">endDate &gt; best_before_limit</span><span class="delimiter">&quot;</span></span>);
query.declareImports(<span class="string"><span class="delimiter">&quot;</span><span class="content">import java.util.Date</span><span class="delimiter">&quot;</span></span>);
query.declareParameters(<span class="string"><span class="delimiter">&quot;</span><span class="content">Date best_before_limit</span><span class="delimiter">&quot;</span></span>);
query.setOrdering(<span class="string"><span class="delimiter">&quot;</span><span class="content">endDate descending</span><span class="delimiter">&quot;</span></span>);
<span class="predefined-type">Collection</span> results = (<span class="predefined-type">Collection</span>)query.execute(my_date_limit);</code></pre>
</div>
</div>
<div class="paragraph">
<p>Single-String JDOQL :</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="predefined-type">Query</span> query = pm.newQuery(<span class="string"><span class="delimiter">&quot;</span><span class="content">SELECT FROM mydomain.Product </span><span class="delimiter">&quot;</span></span> +
<span class="string"><span class="delimiter">&quot;</span><span class="content">WHERE endDate &gt; best_before_limit </span><span class="delimiter">&quot;</span></span> +
<span class="string"><span class="delimiter">&quot;</span><span class="content">PARAMETERS Date best_before_limit </span><span class="delimiter">&quot;</span></span> +
<span class="string"><span class="delimiter">&quot;</span><span class="content">import java.util.Date ORDER BY endDate DESC</span><span class="delimiter">&quot;</span></span>);
<span class="predefined-type">List</span> results = (<span class="predefined-type">List</span>)query.execute(my_date_limit);</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="Example_4_-_Instanceof">Example 4 - Instanceof</h3>
<div class="paragraph">
<p>This example demonstrates use of the "instanceof" operator.
We have a class A that has a field "b" of type B and B has subclasses B1, B2, B3.
Clearly the field "b" of A can be of type B, B1, B2, B3 etc, and we want to find all objects of type A that have the field "b" that is of type B2.
We do it like this</p>
</div>
<div class="paragraph">
<p>Declarative JDOQL :</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="predefined-type">Query</span> query = pm.newQuery(mydomain.A.class);
query.setFilter(<span class="string"><span class="delimiter">&quot;</span><span class="content">b instanceof mydomain.B2</span><span class="delimiter">&quot;</span></span>);
<span class="predefined-type">List</span> results = (<span class="predefined-type">List</span>)query.execute();</code></pre>
</div>
</div>
<div class="paragraph">
<p>Single-String JDOQL :</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="predefined-type">Query</span> query = pm.newQuery(<span class="string"><span class="delimiter">&quot;</span><span class="content">SELECT FROM mydomain.A WHERE b instanceof mydomain.B2</span><span class="delimiter">&quot;</span></span>);
<span class="predefined-type">List</span> results = (<span class="predefined-type">List</span>)query.execute();</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-sm-3">
<nav id="toc" data-spy="affix" data-toggle="toc"></nav>
</div>
</div>
</div>
<footer style="color:#fff; background-color:#222222; padding: 5px;">
<div class="container">
<div class="row" style="margin-top:25px">
<div class="col-sm" align="center">
<a href="https://www.facebook.com/JavaDataObjects" class="externalLink" title="Facebook">Facebook</a>
|
<a href="https://twitter.com/JavaDataObjects" class="externalLink" title="Twitter">Twitter</a>
|
<a href="http://wiki.apache.org/jdo" class="externalLink" title="Wiki">Wiki</a>
|
<a href="http://issues.apache.org/jira/secure/BrowseProject.jspa?id=10630" class="externalLink" title="Issue Tracker">Issue Tracker</a>
|
<a href="mail-lists.html" title="Mailing Lists">Mailing Lists</a>
|
<a href="api31/apidocs/index.html" title="Latest Javadocs">Latest Javadocs</a>
|
<a href="https://privacy.apache.org/policies/privacy-policy-public.html" title="Privacy Policy">Privacy Policy</a>
</div>
</div>
<p class="text-center" style="margin-top:16px">&copy; 2005-2022 Apache Software Foundation. All Rights Reserved.</p>
</div>
</footer>
</body>
</html>