⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 multitabledeleteexecutor.java

📁 一个Java持久层类库
💻 JAVA
字号:
// $Id: MultiTableDeleteExecutor.java 11288 2007-03-15 11:38:45Z steve.ebersole@jboss.com $package org.hibernate.hql.ast.exec;import java.sql.PreparedStatement;import java.sql.SQLException;import java.util.Iterator;import org.hibernate.HibernateException;import org.hibernate.engine.QueryParameters;import org.hibernate.engine.SessionImplementor;import org.hibernate.exception.JDBCExceptionHelper;import org.hibernate.hql.ast.HqlSqlWalker;import org.hibernate.hql.ast.tree.DeleteStatement;import org.hibernate.hql.ast.tree.FromElement;import org.hibernate.param.ParameterSpecification;import org.hibernate.persister.entity.Queryable;import org.hibernate.sql.Delete;import org.hibernate.util.StringHelper;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * Implementation of MultiTableDeleteExecutor. * * @author Steve Ebersole */public class MultiTableDeleteExecutor extends AbstractStatementExecutor {	private static final Logger log = LoggerFactory.getLogger( MultiTableDeleteExecutor.class );	private final Queryable persister;	private final String idInsertSelect;	private final String[] deletes;	public MultiTableDeleteExecutor(HqlSqlWalker walker) {		super( walker, log );		if ( !walker.getSessionFactoryHelper().getFactory().getDialect().supportsTemporaryTables() ) {			throw new HibernateException( "cannot perform multi-table deletes using dialect not supporting temp tables" );		}		DeleteStatement deleteStatement = ( DeleteStatement ) walker.getAST();		FromElement fromElement = deleteStatement.getFromClause().getFromElement();		String bulkTargetAlias = fromElement.getTableAlias();		this.persister = fromElement.getQueryable();		this.idInsertSelect = generateIdInsertSelect( persister, bulkTargetAlias, deleteStatement.getWhereClause() );		log.trace( "Generated ID-INSERT-SELECT SQL (multi-table delete) : " +  idInsertSelect );		String[] tableNames = persister.getConstraintOrderedTableNameClosure();		String[][] columnNames = persister.getContraintOrderedTableKeyColumnClosure();		String idSubselect = generateIdSubselect( persister );		deletes = new String[tableNames.length];		for ( int i = tableNames.length - 1; i >= 0; i-- ) {			// TODO : an optimization here would be to consider cascade deletes and not gen those delete statements;			//      the difficulty is the ordering of the tables here vs the cascade attributes on the persisters ->			//          the table info gotten here should really be self-contained (i.e., a class representation			//          defining all the needed attributes), then we could then get an array of those			final Delete delete = new Delete()					.setTableName( tableNames[i] )					.setWhere( "(" + StringHelper.join( ", ", columnNames[i] ) + ") IN (" + idSubselect + ")" );			if ( getFactory().getSettings().isCommentsEnabled() ) {				delete.setComment( "bulk delete" );			}			deletes[i] = delete.toStatementString();		}	}	public String[] getSqlStatements() {		return deletes;	}	public int execute(QueryParameters parameters, SessionImplementor session) throws HibernateException {		coordinateSharedCacheCleanup( session );		createTemporaryTableIfNecessary( persister, session );		try {			// First, save off the pertinent ids, saving the number of pertinent ids for return			PreparedStatement ps = null;			int resultCount = 0;			try {				try {					ps = session.getBatcher().prepareStatement( idInsertSelect );					Iterator paramSpecifications = getWalker().getParameters().iterator();					int pos = 1;					while ( paramSpecifications.hasNext() ) {						final ParameterSpecification paramSpec = ( ParameterSpecification ) paramSpecifications.next();						pos += paramSpec.bind( ps, parameters, session, pos );					}					resultCount = ps.executeUpdate();				}				finally {					if ( ps != null ) {						session.getBatcher().closeStatement( ps );					}				}			}			catch( SQLException e ) {				throw JDBCExceptionHelper.convert(						getFactory().getSQLExceptionConverter(),				        e,				        "could not insert/select ids for bulk delete",				        idInsertSelect					);			}			// Start performing the deletes			for ( int i = 0; i < deletes.length; i++ ) {				try {					try {						ps = session.getBatcher().prepareStatement( deletes[i] );						ps.executeUpdate();					}					finally {						if ( ps != null ) {							session.getBatcher().closeStatement( ps );						}					}				}				catch( SQLException e ) {					throw JDBCExceptionHelper.convert(							getFactory().getSQLExceptionConverter(),					        e,					        "error performing bulk delete",					        deletes[i]						);				}			}			return resultCount;		}		finally {			dropTemporaryTableIfNecessary( persister, session );		}	}	protected Queryable[] getAffectedQueryables() {		return new Queryable[] { persister };	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -