/* * Hibernate, Relational Persistence for Idiomatic Java * * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Middleware LLC. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA * */ package org.hibernate.sql; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.hibernate.LockMode; import org.hibernate.LockOptions; import org.hibernate.dialect.Dialect; /** * An SQL <tt>SELECT</tt> statement with no table joins * * @author Gavin King */ public class SimpleSelect { public SimpleSelect(Dialect dialect) { this.dialect = dialect; } //private static final Alias DEFAULT_ALIAS = new Alias(10, null); private String tableName; private String orderBy; private Dialect dialect; private LockOptions lockOptions = new LockOptions( LockMode.READ); private String comment; private List columns = new ArrayList(); private Map aliases = new HashMap(); private List whereTokens = new ArrayList(); public SimpleSelect addColumns(String[] columnNames, String[] columnAliases) { for ( int i=0; i<columnNames.length; i++ ) { if ( columnNames[i]!=null ) { addColumn( columnNames[i], columnAliases[i] ); } } return this; } public SimpleSelect addColumns(String[] columns, String[] aliases, boolean[] ignore) { for ( int i=0; i<ignore.length; i++ ) { if ( !ignore[i] && columns[i]!=null ) { addColumn( columns[i], aliases[i] ); } } return this; } public SimpleSelect addColumns(String[] columnNames) { for ( int i=0; i<columnNames.length; i++ ) { if ( columnNames[i]!=null ) addColumn( columnNames[i] ); } return this; } public SimpleSelect addColumn(String columnName) { columns.add(columnName); //aliases.put( columnName, DEFAULT_ALIAS.toAliasString(columnName) ); return this; } public SimpleSelect addColumn(String columnName, String alias) { columns.add(columnName); aliases.put(columnName, alias); return this; } public SimpleSelect setTableName(String tableName) { this.tableName = tableName; return this; } public SimpleSelect setLockOptions( LockOptions lockOptions ) { LockOptions.copy(lockOptions, this.lockOptions); return this; } public SimpleSelect setLockMode(LockMode lockMode) { this.lockOptions.setLockMode( lockMode ); return this; } public SimpleSelect addWhereToken(String token) { whereTokens.add(token); return this; } private void and() { if ( whereTokens.size()>0 ) { whereTokens.add("and"); } } public SimpleSelect addCondition(String lhs, String op, String rhs) { and(); whereTokens.add( lhs + ' ' + op + ' ' + rhs ); return this; } public SimpleSelect addCondition(String lhs, String condition) { and(); whereTokens.add( lhs + ' ' + condition ); return this; } public SimpleSelect addCondition(String[] lhs, String op, String[] rhs) { for ( int i=0; i<lhs.length; i++ ) { addCondition( lhs[i], op, rhs[i] ); } return this; } public SimpleSelect addCondition(String[] lhs, String condition) { for ( int i=0; i<lhs.length; i++ ) { if ( lhs[i]!=null ) addCondition( lhs[i], condition ); } return this; } public String toStatementString() { StringBuffer buf = new StringBuffer( columns.size()*10 + tableName.length() + whereTokens.size() * 10 + 10 ); if ( comment!=null ) { buf.append("/* ").append(comment).append(" */ "); } buf.append("select "); Set uniqueColumns = new HashSet(); Iterator iter = columns.iterator(); boolean appendComma = false; while ( iter.hasNext() ) { String col = (String) iter.next(); String alias = (String) aliases.get(col); if ( uniqueColumns.add(alias==null ? col : alias) ) { if (appendComma) buf.append(", "); buf.append(col); if ( alias!=null && !alias.equals(col) ) { buf.append(" as ") .append(alias); } appendComma = true; } } buf.append(" from ") .append( dialect.appendLockHint(lockOptions.getLockMode(), tableName) ); if ( whereTokens.size() > 0 ) { buf.append(" where ") .append( toWhereClause() ); } if (orderBy!=null) buf.append(orderBy); if (lockOptions!=null) { buf.append( dialect.getForUpdateString(lockOptions) ); } return dialect.transformSelectString( buf.toString() ); } public String toWhereClause() { StringBuffer buf = new StringBuffer( whereTokens.size() * 5 ); Iterator iter = whereTokens.iterator(); while ( iter.hasNext() ) { buf.append( iter.next() ); if ( iter.hasNext() ) buf.append(' '); } return buf.toString(); } public SimpleSelect setOrderBy(String orderBy) { this.orderBy = orderBy; return this; } public SimpleSelect setComment(String comment) { this.comment = comment; return this; } }