Skip to content

Commit 5e82e89

Browse files
committed
Extract Query DSL syntax intro sepate section
1 parent d0921c5 commit 5e82e89

File tree

1 file changed

+36
-9
lines changed

1 file changed

+36
-9
lines changed

criteria.html

+36-9
Original file line numberDiff line numberDiff line change
@@ -159,17 +159,44 @@ <h2>Criteria</h2>
159159
<span class="o">.</span><span class="na">or</span><span class="o">()</span>
160160
<span class="o">.</span><span class="na">pets</span><span class="o">.</span><span class="na">any</span><span class="o">().</span><span class="na">name</span><span class="o">.</span><span class="na">contains</span><span class="o">(</span><span class="s">&quot;fluffy&quot;</span><span class="o">);</span> <span class="c1">// person has a pet which sounds like fluffy</span>
161161
</code></pre></div>
162-
<p>You will notice that there are no <code>and</code> statements (conjunctions) that is because criteria uses
163-
<a href="https://en.wikipedia.org/wiki/Disjunctive_normal_form">Disjunctive Normal Form</a> (in short DNF) by default. Statements are
164-
combined using logical <code>and</code> unless disjunction <code>or()</code> is explicitly used.</p>
165-
166-
<p>For more complex expressions, one can still combine criterias arbitrarily using <code>and</code>s / <code>or</code>s / <code>not</code>s.
167-
Statement like <code>A and (B or C)</code> can be written as follows:</p>
168-
<div class="highlight"><pre><code class="language-java" data-lang="java"><span></span><span class="n">person</span><span class="o">.</span><span class="na">fullName</span><span class="o">.</span><span class="na">is</span><span class="o">(</span><span class="s">&quot;John&quot;</span><span class="o">).</span><span class="na">and</span><span class="o">(</span><span class="n">person</span><span class="o">.</span><span class="na">age</span><span class="o">.</span><span class="na">greaterThan</span><span class="o">(</span><span class="mi">22</span><span class="o">).</span><span class="na">or</span><span class="o">().</span><span class="na">nickName</span><span class="o">.</span><span class="na">isPresent</span><span class="o">())</span>
162+
<p>You will need to add <code>@Criteria</code> to all classes to be queried. For example, to filter on <code>Person.pets.name</code>,
163+
<code>Pet</code> class needs to have <code>@Criteria</code> annotation (otherwise generic <code>ObjectMatcher</code> is used).</p>
164+
165+
<h3>Query DSL Syntax</h3>
166+
167+
<p>In the previous query example you will notice that there are no <code>and</code> statements (conjunctions) that is because criteria uses
168+
<a href="https://en.wikipedia.org/wiki/Disjunctive_normal_form">Disjunctive Normal Form</a> (in short DNF). By default, statements are
169+
combined using logical <code>and</code> (<a href="https://en.wikipedia.org/wiki/Logical_conjunction">conjunction</a>) unless <code>or</code> (<a href="https://en.wikipedia.org/wiki/Logical_disjunction">disjunction</a>) is explicitly used.</p>
170+
<div class="highlight"><pre><code class="language-java" data-lang="java"><span></span><span class="c1">// Some examples of Query DSL</span>
171+
<span class="c1">// left side (DSL) // right side SQL equivalent</span>
172+
<span class="o">.</span><span class="na">fullName</span><span class="o">.</span><span class="na">is</span><span class="o">(</span><span class="s">&quot;John&quot;</span><span class="o">)</span> <span class="c1">// fullName = &#39;John&#39;</span>
173+
<span class="o">.</span><span class="na">fullName</span><span class="o">.</span><span class="na">is</span><span class="o">(</span><span class="s">&quot;John&quot;</span><span class="o">).</span><span class="na">age</span><span class="o">.</span><span class="na">greaterThan</span><span class="o">(</span><span class="mi">21</span><span class="o">)</span> <span class="c1">// fullName = &#39;John&#39; AND age &gt; 21</span>
174+
<span class="o">.</span><span class="na">fullName</span><span class="o">.</span><span class="na">is</span><span class="o">(</span><span class="s">&quot;John&quot;</span><span class="o">).</span><span class="na">age</span><span class="o">.</span><span class="na">greaterThan</span><span class="o">(</span><span class="mi">21</span><span class="o">).</span><span class="na">nickName</span><span class="o">.</span><span class="na">isPresent</span><span class="o">()</span> <span class="c1">// fullName = &#39;John&#39; AND age &gt; 21 AND nickName != null</span>
175+
<span class="o">.</span><span class="na">fullName</span><span class="o">.</span><span class="na">is</span><span class="o">(</span><span class="s">&quot;John&quot;</span><span class="o">).</span><span class="na">or</span><span class="o">().</span><span class="na">fullName</span><span class="o">.</span><span class="na">is</span><span class="o">(</span><span class="s">&quot;Mary&quot;</span><span class="o">)</span> <span class="c1">// fullName = &#39;John&#39; OR fullName = &#39;Mary&#39;</span>
176+
<span class="o">.</span><span class="na">fullName</span><span class="o">.</span><span class="na">is</span><span class="o">(</span><span class="s">&quot;John&quot;</span><span class="o">).</span><span class="na">age</span><span class="o">.</span><span class="na">greaterThan</span><span class="o">(</span><span class="mi">21</span><span class="o">)</span>
177+
<span class="o">.</span><span class="na">or</span><span class="o">()</span>
178+
<span class="o">.</span><span class="na">fullName</span><span class="o">.</span><span class="na">is</span><span class="o">(</span><span class="s">&quot;Mary&quot;</span><span class="o">)</span> <span class="c1">// (fullName = &#39;John&#39; AND age &gt; 21) OR fullName = &#39;Mary&#39;</span>
179+
<span class="o">.</span><span class="na">fullName</span><span class="o">.</span><span class="na">is</span><span class="o">(</span><span class="s">&quot;John&quot;</span><span class="o">).</span><span class="na">age</span><span class="o">.</span><span class="na">greaterThan</span><span class="o">(</span><span class="mi">21</span><span class="o">)</span>
180+
<span class="o">.</span><span class="na">or</span><span class="o">()</span>
181+
<span class="o">.</span><span class="na">fullName</span><span class="o">.</span><span class="na">is</span><span class="o">(</span><span class="s">&quot;Mary&quot;</span><span class="o">).</span><span class="na">age</span><span class="o">.</span><span class="na">greaterThan</span><span class="o">(</span><span class="mi">22</span><span class="o">)</span> <span class="c1">// (fullName = &#39;John&#39; AND age &gt; 21) OR (fullName = &#39;Mary&#39; AND age &gt; 22)</span>
169182
</code></pre></div>
170-
<p>You need to add <code>@Criteria</code> to all classes to be queried. For example, to filter on <code>Person.pets.name</code>,
171-
<code>Pet</code> class needs to have <code>@Criteria</code> annotation (otherwise generic ObjectMatcher is used).</p>
183+
<h4>More complex logical expressions</h4>
172184

185+
<p>For more complex expressions, one can still combine criterias using <code>and</code>s / <code>or</code>s / <code>not</code>s. Boolean algebra methods
186+
allow composition of existing criterias with each other using <code>and</code> / <code>or</code> / <code>not</code> logic.</p>
187+
<div class="highlight"><pre><code class="language-java" data-lang="java"><span></span><span class="c1">// fullName = &#39;John&#39; AND (age &gt; 22 OR nickName != null)</span>
188+
<span class="n">person</span><span class="o">.</span><span class="na">fullName</span><span class="o">.</span><span class="na">is</span><span class="o">(</span><span class="s">&quot;John&quot;</span><span class="o">).</span><span class="na">and</span><span class="o">(</span><span class="n">person</span><span class="o">.</span><span class="na">age</span><span class="o">.</span><span class="na">greaterThan</span><span class="o">(</span><span class="mi">22</span><span class="o">).</span><span class="na">or</span><span class="o">().</span><span class="na">nickName</span><span class="o">.</span><span class="na">isPresent</span><span class="o">())</span>
189+
</code></pre></div>
190+
<p>Since criteria objects are immutable one can safely pass them as variables, constants or function arguments.</p>
191+
<div class="highlight"><pre><code class="language-java" data-lang="java"><span></span><span class="n">PersonCriteria</span> <span class="n">crit</span> <span class="o">=</span> <span class="n">PersonCriteria</span><span class="o">.</span><span class="na">person</span><span class="o">;</span>
192+
<span class="n">drinkingAge</span> <span class="o">=</span> <span class="n">crit</span><span class="o">.</span><span class="na">age</span><span class="o">.</span><span class="na">atLeast</span><span class="o">(</span><span class="mi">21</span><span class="o">);</span>
193+
<span class="n">hasNickname</span> <span class="o">=</span> <span class="n">crit</span><span class="o">.</span><span class="na">nickName</span><span class="o">.</span><span class="na">isPresent</span><span class="o">()</span>
194+
<span class="n">isActive</span> <span class="o">=</span> <span class="n">crit</span><span class="o">.</span><span class="na">isActive</span><span class="o">.</span><span class="na">isTrue</span><span class="o">();</span>
195+
196+
<span class="c1">// ...</span>
197+
<span class="c1">// (age &gt; 21 OR nickName != null) AND isActive = true</span>
198+
<span class="k">return</span> <span class="n">drinkingAge</span><span class="o">.</span><span class="na">or</span><span class="o">(</span><span class="n">hasNickname</span><span class="o">).</span><span class="na">and</span><span class="o">(</span><span class="n">isActive</span><span class="o">);</span>
199+
</code></pre></div>
173200
<hr>
174201

175202
<h2>Repository</h2>

0 commit comments

Comments
 (0)