/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
 * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
 */
package org.hibernate.criterion;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.TypedValue;
import org.hibernate.internal.util.StringHelper;

A sequence of a logical expressions combined by some associative logical operator
Author:Gavin King, Steve Ebersole
/** * A sequence of a logical expressions combined by some * associative logical operator * * @author Gavin King * @author Steve Ebersole */
public class Junction implements Criterion { private final Nature nature; private final List<Criterion> conditions = new ArrayList<Criterion>(); protected Junction(Nature nature) { this.nature = nature; } protected Junction(Nature nature, Criterion... criterion) { this( nature ); Collections.addAll( conditions, criterion ); }
Adds a criterion to the junction (and/or)
Params:
  • criterion – The criterion to add
Returns:this, for method chaining
/** * Adds a criterion to the junction (and/or) * * @param criterion The criterion to add * * @return {@code this}, for method chaining */
public Junction add(Criterion criterion) { conditions.add( criterion ); return this; } public Nature getNature() { return nature; }
Access the conditions making up the junction
Returns:the criterion
/** * Access the conditions making up the junction * * @return the criterion */
public Iterable<Criterion> conditions() { return conditions; } @Override public TypedValue[] getTypedValues(Criteria crit, CriteriaQuery criteriaQuery) throws HibernateException { final ArrayList<TypedValue> typedValues = new ArrayList<TypedValue>(); for ( Criterion condition : conditions ) { final TypedValue[] subValues = condition.getTypedValues( crit, criteriaQuery ); Collections.addAll( typedValues, subValues ); } return typedValues.toArray( new TypedValue[ typedValues.size() ] ); } @Override public String toSqlString(Criteria crit, CriteriaQuery criteriaQuery) throws HibernateException { if ( conditions.size()==0 ) { return "1=1"; } final StringBuilder buffer = new StringBuilder().append( '(' ); final Iterator itr = conditions.iterator(); while ( itr.hasNext() ) { buffer.append( ( (Criterion) itr.next() ).toSqlString( crit, criteriaQuery ) ); if ( itr.hasNext() ) { buffer.append( ' ' ) .append( nature.getOperator() ) .append( ' ' ); } } return buffer.append( ')' ).toString(); } @Override public String toString() { return '(' + StringHelper.join( ' ' + nature.getOperator() + ' ', conditions.iterator() ) + ')'; }
The type of junction
/** * The type of junction */
public static enum Nature {
An AND
/** * An AND */
AND,
An OR
/** * An OR */
OR;
The corresponding SQL operator
Returns:SQL operator
/** * The corresponding SQL operator * * @return SQL operator */
public String getOperator() { return name().toLowerCase(Locale.ROOT); } } }