You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
5.1 KiB
196 lines
5.1 KiB
/* |
|
* 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 com.fr.third.org.hibernate.sql; |
|
import com.fr.third.org.hibernate.LockMode; |
|
import com.fr.third.org.hibernate.LockOptions; |
|
import com.fr.third.org.hibernate.dialect.Dialect; |
|
import com.fr.third.org.hibernate.internal.util.StringHelper; |
|
|
|
|
|
/** |
|
* A simple SQL <tt>SELECT</tt> statement |
|
* @author Gavin King |
|
*/ |
|
public class Select { |
|
|
|
private String selectClause; |
|
private String fromClause; |
|
private String outerJoinsAfterFrom; |
|
private String whereClause; |
|
private String outerJoinsAfterWhere; |
|
private String orderByClause; |
|
private String groupByClause; |
|
private String comment; |
|
private LockOptions lockOptions = new LockOptions(); |
|
public final Dialect dialect; |
|
|
|
private int guesstimatedBufferSize = 20; |
|
|
|
public Select(Dialect dialect) { |
|
this.dialect = dialect; |
|
} |
|
|
|
/** |
|
* Construct an SQL <tt>SELECT</tt> statement from the given clauses |
|
*/ |
|
public String toStatementString() { |
|
StringBuilder buf = new StringBuilder(guesstimatedBufferSize); |
|
if ( StringHelper.isNotEmpty(comment) ) { |
|
buf.append("/* ").append(Dialect.escapeComment(comment)).append(" */ "); |
|
} |
|
|
|
buf.append("select ").append(selectClause) |
|
.append(" from ").append(fromClause); |
|
|
|
if ( StringHelper.isNotEmpty(outerJoinsAfterFrom) ) { |
|
buf.append(outerJoinsAfterFrom); |
|
} |
|
|
|
if ( StringHelper.isNotEmpty(whereClause) || StringHelper.isNotEmpty(outerJoinsAfterWhere) ) { |
|
buf.append(" where " ); |
|
// the outerJoinsAfterWhere needs to come before where clause to properly |
|
// handle dynamic filters |
|
if ( StringHelper.isNotEmpty(outerJoinsAfterWhere) ) { |
|
buf.append(outerJoinsAfterWhere); |
|
if ( StringHelper.isNotEmpty(whereClause) ) { |
|
buf.append( " and " ); |
|
} |
|
} |
|
if ( StringHelper.isNotEmpty( whereClause ) ) { |
|
buf.append(whereClause); |
|
} |
|
} |
|
|
|
if ( StringHelper.isNotEmpty(groupByClause) ) { |
|
buf.append(" group by ").append(groupByClause); |
|
} |
|
|
|
if ( StringHelper.isNotEmpty(orderByClause) ) { |
|
buf.append(" order by ").append(orderByClause); |
|
} |
|
|
|
if (lockOptions.getLockMode() != LockMode.NONE) { |
|
buf.append(dialect.getForUpdateString(lockOptions)); |
|
} |
|
|
|
return dialect.transformSelectString( buf.toString() ); |
|
} |
|
|
|
/** |
|
* Sets the fromClause. |
|
* @param fromClause The fromClause to set |
|
*/ |
|
public Select setFromClause(String fromClause) { |
|
this.fromClause = fromClause; |
|
this.guesstimatedBufferSize += fromClause.length(); |
|
return this; |
|
} |
|
|
|
public Select setFromClause(String tableName, String alias) { |
|
this.fromClause = tableName + ' ' + alias; |
|
this.guesstimatedBufferSize += fromClause.length(); |
|
return this; |
|
} |
|
|
|
public Select setOrderByClause(String orderByClause) { |
|
this.orderByClause = orderByClause; |
|
this.guesstimatedBufferSize += orderByClause.length(); |
|
return this; |
|
} |
|
|
|
public Select setGroupByClause(String groupByClause) { |
|
this.groupByClause = groupByClause; |
|
this.guesstimatedBufferSize += groupByClause.length(); |
|
return this; |
|
} |
|
|
|
public Select setOuterJoins(String outerJoinsAfterFrom, String outerJoinsAfterWhere) { |
|
this.outerJoinsAfterFrom = outerJoinsAfterFrom; |
|
|
|
// strip off any leading 'and' token |
|
String tmpOuterJoinsAfterWhere = outerJoinsAfterWhere.trim(); |
|
if ( tmpOuterJoinsAfterWhere.startsWith("and") ) { |
|
tmpOuterJoinsAfterWhere = tmpOuterJoinsAfterWhere.substring(4); |
|
} |
|
this.outerJoinsAfterWhere = tmpOuterJoinsAfterWhere; |
|
|
|
this.guesstimatedBufferSize += outerJoinsAfterFrom.length() + outerJoinsAfterWhere.length(); |
|
return this; |
|
} |
|
|
|
|
|
/** |
|
* Sets the selectClause. |
|
* @param selectClause The selectClause to set |
|
*/ |
|
public Select setSelectClause(String selectClause) { |
|
this.selectClause = selectClause; |
|
this.guesstimatedBufferSize += selectClause.length(); |
|
return this; |
|
} |
|
|
|
public Select setSelectClause(SelectFragment selectFragment) { |
|
setSelectClause( selectFragment.toFragmentString().substring( 2 ) ); |
|
return this; |
|
} |
|
|
|
/** |
|
* Sets the whereClause. |
|
* @param whereClause The whereClause to set |
|
*/ |
|
public Select setWhereClause(String whereClause) { |
|
this.whereClause = whereClause; |
|
this.guesstimatedBufferSize += whereClause.length(); |
|
return this; |
|
} |
|
|
|
public Select setComment(String comment) { |
|
this.comment = comment; |
|
this.guesstimatedBufferSize += comment.length(); |
|
return this; |
|
} |
|
|
|
/** |
|
* Get the current lock mode |
|
* @return LockMode |
|
* @deprecated Instead use getLockOptions |
|
*/ |
|
@Deprecated |
|
public LockMode getLockMode() { |
|
return lockOptions.getLockMode(); |
|
} |
|
|
|
/** |
|
* Set the lock mode |
|
* @param lockMode |
|
* @return this object |
|
* @deprecated Instead use setLockOptions |
|
*/ |
|
@Deprecated |
|
public Select setLockMode(LockMode lockMode) { |
|
lockOptions.setLockMode(lockMode); |
|
return this; |
|
} |
|
|
|
/** |
|
* Get the current lock options |
|
* @return LockOptions |
|
*/ |
|
public LockOptions getLockOptions() { |
|
return lockOptions; |
|
} |
|
|
|
/** |
|
* Set the lock options |
|
* @param lockOptions |
|
* @return this object |
|
*/ |
|
public Select setLockOptions(LockOptions lockOptions) { |
|
LockOptions.copy(lockOptions, this.lockOptions); |
|
return this; |
|
} |
|
}
|
|
|