Coverage Report - org.kuali.rice.core.api.criteria.CriteriaBuilder
 
Classes in this File Line Coverage Branch Coverage Complexity
CriteriaBuilder
100%
49/49
100%
4/4
1.13
CriteriaBuilder$AndEntry
100%
5/5
N/A
1.13
CriteriaBuilder$Entry
N/A
N/A
1.13
CriteriaBuilder$OrEntry
100%
5/5
N/A
1.13
CriteriaBuilder$SimpleEntry
100%
4/4
N/A
1.13
 
 1  
 /*
 2  
  * Copyright 2011 The Kuali Foundation
 3  
  *
 4  
  * Licensed under the Educational Community License, Version 1.0 (the "License");
 5  
  * you may not use this file except in compliance with the License.
 6  
  * You may obtain a copy of the License at
 7  
  *
 8  
  * http://www.opensource.org/licenses/ecl1.php
 9  
  *
 10  
  * Unless required by applicable law or agreed to in writing, software
 11  
  * distributed under the License is distributed on an "AS IS" BASIS,
 12  
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13  
  * See the License for the specific language governing permissions and
 14  
  * limitations under the License.
 15  
  */
 16  
 package org.kuali.rice.core.api.criteria;
 17  
 
 18  
 import java.math.BigDecimal;
 19  
 import java.math.BigInteger;
 20  
 import java.util.ArrayList;
 21  
 import java.util.Calendar;
 22  
 import java.util.Date;
 23  
 import java.util.List;
 24  
 import java.util.concurrent.atomic.AtomicInteger;
 25  
 import java.util.concurrent.atomic.AtomicLong;
 26  
 
 27  
 /**
 28  
  * Aids in the construction of {@link Criteria} object for use in
 29  
  * criteria-based queries.
 30  
  * 
 31  
  * <p>In order to construct an instance of a {@link CriteriaBuilder}, use the
 32  
  * {@link #newCriteriaBuilder(Class)} method.  The given class type should
 33  
  * indicate the type of object against which the criteria will be used to
 34  
  * query.  This is used to aid in the validation and construction of the
 35  
  * property paths which identify the properties of the object which will be 
 36  
  * evaluated during execution of the query.
 37  
  * 
 38  
  * <p>A propertyPath represents a relative path from the parameterized type "T"
 39  
  * and supports dot-notation to access nested properties of the "T" class.
 40  
  * 
 41  
  * <p>While many of the methods used to construct the criteria on this class
 42  
  * take a generic {@link Object} value, depending on the particular expression
 43  
  * only certain values might be valid.  The criteria framework supports four
 44  
  * different "classes" of values, as follows:
 45  
  * 
 46  
  * <ol>
 47  
  *   <li>character data</li>
 48  
  *   <li>decimals</li>
 49  
  *   <li>integers</li>
 50  
  *   <li>date-time</li>
 51  
  * </ol>
 52  
  * 
 53  
  * <p>For each of the above, the following object types are supported:
 54  
  * 
 55  
  * <ol>
 56  
  *   <li><strong>character data</strong> - {@link CharSequence}</li>
 57  
  *   <li><strong>decimals</strong> - {@link BigDecimal}, {@link Float}, {@link Double}</li>
 58  
  *   <li><strong>integers</strong> - {@link BigInteger}, {@link Short}, {@link Integer}, {@link Long}, {@link AtomicInteger}, {@link AtomicLong}</li>
 59  
  *   <li><strong>date-time</strong> - {@link Date}, {@link Calendar}</li>
 60  
  * </ol> 
 61  
  * 
 62  
  * <p>Once a new instance is obtained, the criteria is built by appending
 63  
  * the various expressions together using the methods provided.  The criteria
 64  
  * produced by the builder will contain an implicit "and" of any of the
 65  
  * expressions which are added at the top-level of the builder.  Each
 66  
  * invocation of one of the methods on the builder will add the related
 67  
  * expression to the end of the entries which are tracked internally on this
 68  
  * builder.  Once the {@link #build()} method is invoked, a criteria
 69  
  * object will be constructed and returned which contains all of the defined
 70  
  * expressions.
 71  
  * 
 72  
  * <p>It is possible to construct an empty set of criteria by creating a new
 73  
  * builder and then simply invoking {@link #build()} on it without adding any
 74  
  * expressions.
 75  
  * 
 76  
  * <p>This class is <strong>not</strong> thread safe.  Once a new instance is obtained it
 77  
  * should only be used by a single thread.  The resulting {@link Criteria}
 78  
  * which is created when the {@link #build()} method is invoked is both
 79  
  * immutable and thread-safe.
 80  
  * 
 81  
  * @param <T> the type of the class to which property paths are relative 
 82  
  * 
 83  
  * @see Criteria
 84  
  * @see QueryByCriteria
 85  
  * 
 86  
  * @author Kuali Rice Team (rice.collab@kuali.org)
 87  
  *
 88  
  */
 89  
 public final class CriteriaBuilder<T> {
 90  
         
 91  
         private final List<Entry> entries; 
 92  
         
 93  54
         private CriteriaBuilder() {
 94  54
                 entries = new ArrayList<Entry>();
 95  54
         }
 96  
         
 97  
         /**
 98  
          * Constructs a new {@link CriteriaBuilder} targeting criteria that will be
 99  
          * used to query for data of the targetClass's type.  The builder
 100  
          * that is created will produce a {@link Criteria} object which will contain
 101  
          * an implicit "and" of all expressions contained within.
 102  
          * 
 103  
          * @param targetClass the target class which represents the root from which
 104  
          * property paths are defined
 105  
          * 
 106  
          * @return the newly created {@link CriteriaBuilder}
 107  
          * 
 108  
          * @throws IllegalArgumentException if the targetClass is null
 109  
          */
 110  
         public static <T> CriteriaBuilder<T> newCriteriaBuilder(Class<T> targetClass) {
 111  42
                 if (targetClass == null) {
 112  1
                         throw new IllegalArgumentException("Target class cannot be null.");
 113  
                 }
 114  41
                 return new CriteriaBuilder<T>();
 115  
         }
 116  
 
 117  
         /**
 118  
          * Appends an {@link EqualExpression} to the builder.  Defines that the
 119  
          * property represented by the given path should be equal to the specified
 120  
          * value. 
 121  
          * 
 122  
          * <p>Supports the following types of values:
 123  
          * 
 124  
          * <ul>
 125  
          *   <li>character data</li>
 126  
          *   <li>decimals</li>
 127  
          *   <li>integers</li>
 128  
          *   <li>date-time</li>
 129  
          * </ul>
 130  
          * 
 131  
          * @param propertyPath the path to the property which should be evaluated
 132  
          * @param value the value to compare with the property value located at the
 133  
          * propertyPath
 134  
          * 
 135  
          * @return a reference to "this" CriteriaBuilder, allows for fluent
 136  
          * chaining of method calls
 137  
          * 
 138  
          * @throws IllegalArgumentException if the propertyPath is null
 139  
          * @throws IllegalArgumentException if the value is null or of an invalid type
 140  
          * 
 141  
          * @see EqualExpression
 142  
          */
 143  
         public CriteriaBuilder<T> equal(String propertyPath, Object value) {
 144  14
                 EqualExpression expression = new EqualExpression(propertyPath, CriteriaSupportUtils.determineCriteriaValue(value));
 145  12
                 entries.add(new SimpleEntry(expression));
 146  12
                 return this;
 147  
         }
 148  
         
 149  
         /**
 150  
          * Appends a {@link NotEqualExpression} to the builder.  Defines that the
 151  
          * property represented by the given path should <strong>not</strong> be
 152  
          * equal to the specified value. 
 153  
          * 
 154  
          * <p>Supports the following types of values:
 155  
          * 
 156  
          * <ul>
 157  
          *   <li>character data</li>
 158  
          *   <li>decimals</li>
 159  
          *   <li>integers</li>
 160  
          *   <li>date-time</li>
 161  
          * </ul>
 162  
          * 
 163  
          * @param propertyPath the path to the property which should be evaluated
 164  
          * @param value the value to compare with the property value located at the
 165  
          * propertyPath
 166  
          * 
 167  
          * @return a reference to "this" CriteriaBuilder, allows for fluent
 168  
          * chaining of method calls
 169  
          * 
 170  
          * @throws IllegalArgumentException if the propertyPath is null
 171  
          * @throws IllegalArgumentException if the value is null or of an invalid type
 172  
          * 
 173  
          * @see NotEqualExpression
 174  
          */
 175  
         public CriteriaBuilder<T> notEqual(String propertyPath, Object value) {
 176  3
                 NotEqualExpression expression = new NotEqualExpression(propertyPath, CriteriaSupportUtils.determineCriteriaValue(value));
 177  1
                 entries.add(new SimpleEntry(expression));
 178  1
                 return this;
 179  
         }
 180  
         
 181  
         /**
 182  
          * Appends a {@link LikeExpression} to the builder.  Defines that the
 183  
          * property represented by the given path should match the specified value,
 184  
          * but supports the use of wildcards in the given value.
 185  
          * 
 186  
          * <p>The supported wildcards include:
 187  
          * 
 188  
          * <ul>
 189  
          *   <li><strong>?</strong> - matches on any single character</li>
 190  
          *   <li><strong>*</strong> - matches any string of any length (including zero length)</li>
 191  
          * </ul>
 192  
          * 
 193  
          * <p>Because of this, the like expression only supports character data
 194  
          * for the passed-in value.
 195  
          * 
 196  
          * @param propertyPath the path to the property which should be evaluated
 197  
          * @param value the value to compare with the property value located at the
 198  
          * propertyPath
 199  
          * 
 200  
          * @return a reference to "this" CriteriaBuilder, allows for fluent
 201  
          * chaining of method calls
 202  
          * 
 203  
          * @throws IllegalArgumentException if the propertyPath is null
 204  
          * @throws IllegalArgumentException if the value is null
 205  
          * 
 206  
          * @see LikeExpression for more information
 207  
          */
 208  
         public CriteriaBuilder<T> like(String propertyPath, CharSequence value) {
 209  6
                 LikeExpression expression = new LikeExpression(propertyPath, CriteriaSupportUtils.determineCriteriaValue(value));
 210  4
                 entries.add(new SimpleEntry(expression));
 211  4
                 return this;
 212  
         }
 213  
         
 214  
         /**
 215  
          * Appends an {@link InExpression} to the builder.  Defines that the
 216  
          * property represented by the given path should be contained within the
 217  
          * specified list of values.
 218  
          * 
 219  
          * <p>Supports any of the valid types of value in the value list, with the
 220  
          * restriction that all items in the list of values must be of the same type.
 221  
          * 
 222  
          * @param propertyPath the path to the property which should be evaluated
 223  
          * @param value the value to compare with the property value located at the
 224  
          * propertyPath
 225  
          * 
 226  
          * @return a reference to "this" CriteriaBuilder, allows for fluent
 227  
          * chaining of method calls
 228  
          * 
 229  
          * @throws IllegalArgumentException if the propertyPath is null
 230  
          * @throws IllegalArgumentException if the values list is null, empty,
 231  
          * contains object of different types, or includes objects of an invalid type
 232  
          * 
 233  
          * @see InExpression for more information
 234  
          */
 235  
         public CriteriaBuilder<T> in(String propertyPath, List<?> values) {
 236  8
                 InExpression expression = new InExpression(propertyPath, CriteriaSupportUtils.determineCriteriaValueList(values));
 237  5
                 entries.add(new SimpleEntry(expression));
 238  5
                 return this;
 239  
         }
 240  
         
 241  
         /**
 242  
          * Appends a {@link NotInExpression} to the builder.  Defines that the
 243  
          * property represented by the given path should <strong>not</strong> be
 244  
          * contained within the specified list of values.
 245  
          * 
 246  
          * <p>Supports any of the valid types of value in the value list, with the
 247  
          * restriction that all items in the list of values must be of the same type.
 248  
          * 
 249  
          * @param propertyPath the path to the property which should be evaluated
 250  
          * @param value the value to compare with the property value located at the
 251  
          * propertyPath
 252  
          * 
 253  
          * @return a reference to "this" CriteriaBuilder, allows for fluent
 254  
          * chaining of method calls
 255  
          * 
 256  
          * @throws IllegalArgumentException if the propertyPath is null
 257  
          * @throws IllegalArgumentException if the values list is null, empty,
 258  
          * contains object of different types, or includes objects of an invalid type
 259  
          * 
 260  
          * @see InExpression
 261  
          */
 262  
         public CriteriaBuilder<T> notIn(String propertyPath, List<?> values) {
 263  5
                 NotInExpression expression = new NotInExpression(propertyPath, CriteriaSupportUtils.determineCriteriaValueList(values));
 264  2
                 entries.add(new SimpleEntry(expression));
 265  2
                 return this;
 266  
         }
 267  
         
 268  
         /**
 269  
          * Appends a {@link GreaterThanExpression} to the builder.  Defines that
 270  
          * the property represented by the given path should be greater than the
 271  
          * specified value. 
 272  
          * 
 273  
          * <p>Supports the following types of values:
 274  
          * 
 275  
          * <ul>
 276  
          *   <li>decimals</li>
 277  
          *   <li>integers</li>
 278  
          *   <li>date-time</li>
 279  
          * </ul>
 280  
          * 
 281  
          * @param propertyPath the path to the property which should be evaluated
 282  
          * @param value the value to compare with the property value located at the
 283  
          * propertyPath
 284  
          * 
 285  
          * @return a reference to "this" CriteriaBuilder, allows for fluent
 286  
          * chaining of method calls
 287  
          * 
 288  
          * @throws IllegalArgumentException if the propertyPath is null
 289  
          * @throws IllegalArgumentException if the value is null or of an invalid type
 290  
          * 
 291  
          * @see GreaterThanExpression
 292  
          */
 293  
         public CriteriaBuilder<T> greaterThan(String propertyPath, Object value) {
 294  9
                 GreaterThanExpression expression = new GreaterThanExpression(propertyPath, CriteriaSupportUtils.determineCriteriaValue(value));
 295  6
                 entries.add(new SimpleEntry(expression));
 296  6
                 return this;
 297  
         }
 298  
         
 299  
         /**
 300  
          * Appends a {@link GreaterThanOrEqualExpression} to the builder.  Defines
 301  
          * that the property represented by the given path should be greater than
 302  
          * or equal to the specified value. 
 303  
          * 
 304  
          * <p>Supports the following types of values:
 305  
          * 
 306  
          * <ul>
 307  
          *   <li>decimals</li>
 308  
          *   <li>integers</li>
 309  
          *   <li>date-time</li>
 310  
          * </ul>
 311  
          * 
 312  
          * @param propertyPath the path to the property which should be evaluated
 313  
          * @param value the value to compare with the property value located at the
 314  
          * propertyPath
 315  
          * 
 316  
          * @return a reference to "this" CriteriaBuilder, allows for fluent
 317  
          * chaining of method calls
 318  
          * 
 319  
          * @throws IllegalArgumentException if the propertyPath is null
 320  
          * @throws IllegalArgumentException if the value is null or of an invalid type
 321  
          * 
 322  
          * @see GreaterThanOrEqualExpression
 323  
          */
 324  
         public CriteriaBuilder<T> greaterThanOrEqual(String propertyPath, Object value) {
 325  3
                 GreaterThanOrEqualExpression expression = new GreaterThanOrEqualExpression(propertyPath, CriteriaSupportUtils.determineCriteriaValue(value));
 326  1
                 entries.add(new SimpleEntry(expression));
 327  1
                 return this;
 328  
         }
 329  
         
 330  
         /**
 331  
          * Appends a {@link LessThanExpression} to the builder.  Defines that
 332  
          * the property represented by the given path should be less than the
 333  
          * specified value. 
 334  
          * 
 335  
          * <p>Supports the following types of values:
 336  
          * 
 337  
          * <ul>
 338  
          *   <li>decimals</li>
 339  
          *   <li>integers</li>
 340  
          *   <li>date-time</li>
 341  
          * </ul>
 342  
          * 
 343  
          * @param propertyPath the path to the property which should be evaluated
 344  
          * @param value the value to compare with the property value located at the
 345  
          * propertyPath
 346  
          * 
 347  
          * @return a reference to "this" CriteriaBuilder, allows for fluent
 348  
          * chaining of method calls
 349  
          * 
 350  
          * @throws IllegalArgumentException if the propertyPath is null
 351  
          * @throws IllegalArgumentException if the value is null or of an invalid type
 352  
          * 
 353  
          * @see LessThanExpression
 354  
          */
 355  
         public CriteriaBuilder<T> lessThan(String propertyPath, Object value) {
 356  5
                 LessThanExpression expression = new LessThanExpression(propertyPath, CriteriaSupportUtils.determineCriteriaValue(value));
 357  3
                 entries.add(new SimpleEntry(expression));
 358  3
                 return this;
 359  
         }
 360  
         
 361  
         /**
 362  
          * Appends a {@link LessThanOrEqualExpression} to the builder.  Defines
 363  
          * that the property represented by the given path should be less than
 364  
          * or equal to the specified value. 
 365  
          * 
 366  
          * <p>Supports the following types of values:
 367  
          * 
 368  
          * <ul>
 369  
          *   <li>decimals</li>
 370  
          *   <li>integers</li>
 371  
          *   <li>date-time</li>
 372  
          * </ul>
 373  
          * 
 374  
          * @param propertyPath the path to the property which should be evaluated
 375  
          * @param value the value to compare with the property value located at the
 376  
          * propertyPath
 377  
          * 
 378  
          * @return a reference to "this" CriteriaBuilder, allows for fluent
 379  
          * chaining of method calls
 380  
          * 
 381  
          * @throws IllegalArgumentException if the propertyPath is null
 382  
          * @throws IllegalArgumentException if the value is null or of an invalid type
 383  
          * 
 384  
          * @see LessThanOrEqualExpression
 385  
          */
 386  
         public CriteriaBuilder<T> lessThanOrEqual(String propertyPath, Object value) {
 387  3
                 LessThanOrEqualExpression expression = new LessThanOrEqualExpression(propertyPath, CriteriaSupportUtils.determineCriteriaValue(value));
 388  1
                 entries.add(new SimpleEntry(expression));
 389  1
                 return this;
 390  
         }
 391  
                 
 392  
         /**
 393  
          * Appends a {@link NullExpression} to the builder.  Defines that the
 394  
          * property represented by the given path should be null.
 395  
          * 
 396  
          * @param propertyPath the path to the property which should be evaluated
 397  
          * 
 398  
          * @return a reference to "this" CriteriaBuilder, allows for fluent
 399  
          * chaining of method calls
 400  
          * 
 401  
          * @throws IllegalArgumentException if the propertyPath is null
 402  
          * 
 403  
          * @see NullExpression
 404  
          */
 405  
         public CriteriaBuilder<T> isNull(String propertyPath) {
 406  3
                 NullExpression expression = new NullExpression(propertyPath);
 407  1
                 entries.add(new SimpleEntry(expression));
 408  1
                 return this;
 409  
         }
 410  
         
 411  
         /**
 412  
          * Appends a {@link NotNullExpression} to the builder.  Defines that the
 413  
          * property represented by the given path should <strong>not</strong> be null.
 414  
          * 
 415  
          * @param propertyPath the path to the property which should be evaluated
 416  
          * 
 417  
          * @return a reference to "this" CriteriaBuilder, allows for fluent
 418  
          * chaining of method calls
 419  
          * 
 420  
          * @throws IllegalArgumentException if the propertyPath is null
 421  
          * 
 422  
          * @see NotNullExpression
 423  
          */
 424  
         public CriteriaBuilder<T> isNotNull(String propertyPath) {
 425  3
                 NotNullExpression expression = new NotNullExpression(propertyPath);
 426  1
                 entries.add(new SimpleEntry(expression));
 427  1
                 return this;
 428  
         }
 429  
         
 430  
         /**
 431  
          * Appends an {@link AndExpression} to the builder and returns a reference
 432  
          * to a {@link CriteriaBuilder} that can be used to define the
 433  
          * expressions contained within the "and" expression.
 434  
          * 
 435  
          * <p>An "and" expression will evaluate the truth value of all of it's
 436  
          * internal expressions and, if all of them evaluate to true, then
 437  
          * the and expression itself should evaluate to true.
 438  
          * 
 439  
          * <p>It's important to note that the {@link CriteriaBuilder} returned
 440  
          * by the {@link #and()} method is not the same as the builder on which
 441  
          * it was invoked.  Instead this is a new builder that can be used to
 442  
          * construct the contents of the "and".  You should never have to manually
 443  
          * invoke {@link #build()} on the builder returned from this method
 444  
          * because it will be automatically invoked when the top-level builder's
 445  
          * {@link #build()} method is invoked.
 446  
          * 
 447  
          * @return a reference to a {@link CriteriaBuilder} that can be used to
 448  
          * construct the contents of the and expression
 449  
          * 
 450  
          * @see AndExpression
 451  
          */
 452  
         public CriteriaBuilder<T> and() {
 453  7
                 CriteriaBuilder<T> criteriaBuilder = new CriteriaBuilder<T>();
 454  7
                 entries.add(new AndEntry<T>(criteriaBuilder));
 455  7
                 return criteriaBuilder;
 456  
         }
 457  
         
 458  
         /**
 459  
          * Appends an {@link OrExpression} to the builder and returns a reference
 460  
          * to a {@link CriteriaBuilder} that can be used to define the
 461  
          * expressions contained within the "or" expression.
 462  
          * 
 463  
          * <p>An "or" expression will evaluate the truth value of all of it's
 464  
          * internal expressions and, if any one of them evaluate to true, then
 465  
          * the and expression itself should evaluate to true.  If all expressions
 466  
          * contained within the "or" evaluate to false, then the or iself will
 467  
          * evaluate to false.
 468  
          * 
 469  
          * <p>It's important to note that the {@link CriteriaBuilder} returned
 470  
          * by the {@link #or()} method is not the same as the builder on which
 471  
          * it was invoked.  Instead this is a new builder that can be used to
 472  
          * construct the contents of the "or".  You should never have to manually
 473  
          * invoke {@link #build()} on the builder returned from this method
 474  
          * because it will be automatically invoked when the top-level builder's
 475  
          * {@link #build()} method is invoked.
 476  
          * 
 477  
          * @return a reference to a {@link CriteriaBuilder} that can be used to
 478  
          * construct the contents of the or expression
 479  
          * 
 480  
          * @see OrExpression
 481  
          */
 482  
         public CriteriaBuilder<T> or() {
 483  6
                 CriteriaBuilder<T> criteriaBuilder = new CriteriaBuilder<T>();
 484  6
                 entries.add(new OrEntry<T>(criteriaBuilder));
 485  6
                 return criteriaBuilder;
 486  
         }
 487  
         
 488  
         /**
 489  
          * Builds an immutable {@link Criteria} object which contains instantiated
 490  
          * forms of all the expressions that were defined during interaction with
 491  
          * this builder prior to the invocation of this method.
 492  
          * 
 493  
          * <p>The resulting criteria will represent an implicit "and" of all
 494  
          * expressions included inside of it at the top level.  When invoked, this
 495  
          * method will recursively invoke any builders created by the {@link #and()}
 496  
          * and {@link #or()} and use the expressions on the resulting criteria to
 497  
          * form the top-level criteria.
 498  
          * 
 499  
          * <p>In general practice, this method should only be invoked once, but if
 500  
          * invoked more than once against the same builder state then it will
 501  
          * return an equivalent criteria object.  Additionally, this builder is
 502  
          * still active after this method has been invoked, so additional
 503  
          * expressions could be added and a new criteria built at a later time.
 504  
          * 
 505  
          * @return a Criteria object built from the expressions defined by this builder
 506  
          */
 507  
         public Criteria build() {
 508  8
                 List<Expression> builtExpressions = new ArrayList<Expression>();
 509  8
                 for (Entry entry : entries) {
 510  27
                         builtExpressions.add(entry.buildExpression());
 511  
                 }
 512  8
                 return new Criteria(builtExpressions);
 513  
         }
 514  
         
 515  
         private static interface Entry {
 516  
                 
 517  
                 public Expression buildExpression();
 518  
                 
 519  
         }
 520  
         
 521  
         private static final class SimpleEntry implements Entry {
 522  
                 
 523  
                 private Expression expression;
 524  
                 
 525  37
                 SimpleEntry(Expression expression) {
 526  37
                         this.expression = expression;
 527  37
                 }
 528  
                 
 529  
                 public Expression buildExpression() {
 530  22
                         return expression;
 531  
                 }
 532  
                 
 533  
         }
 534  
         
 535  
         private static final class AndEntry<T> implements Entry {
 536  
                 
 537  
                 private CriteriaBuilder<T> criteriaBuilder;
 538  
                 
 539  7
                 AndEntry(CriteriaBuilder<T> criteriaBuilder) {
 540  7
                         this.criteriaBuilder = criteriaBuilder;
 541  7
                 }
 542  
                 
 543  
                 public Expression buildExpression() {
 544  2
                         Criteria criteria = criteriaBuilder.build();
 545  2
                         return new AndExpression(criteria.getExpressions());
 546  
                 }
 547  
                 
 548  
         }
 549  
         
 550  
         private static final class OrEntry<T> implements Entry {
 551  
                 
 552  
                 private CriteriaBuilder<T> criteriaBuilder;
 553  
                 
 554  6
                 OrEntry(CriteriaBuilder<T> criteriaBuilder) {
 555  6
                         this.criteriaBuilder = criteriaBuilder;
 556  6
                 }
 557  
                 
 558  
                 public Expression buildExpression() {
 559  3
                         Criteria criteria = criteriaBuilder.build();
 560  3
                         return new OrExpression(criteria.getExpressions());
 561  
                 }
 562  
                 
 563  
         }
 564  
 
 565  
 }