/* * 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.hql.internal.ast.exec; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Iterator; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.engine.spi.QueryParameters; import org.hibernate.engine.spi.RowSelection; import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.hql.internal.ast.HqlSqlWalker; import org.hibernate.hql.internal.ast.QuerySyntaxException; import org.hibernate.hql.internal.ast.SqlGenerator; import org.hibernate.param.ParameterSpecification; import org.hibernate.persister.entity.Queryable; import antlr.RecognitionException; /** * Implementation of BasicExecutor. * * @author Steve Ebersole */ public class BasicExecutor extends AbstractStatementExecutor { private final Queryable persister; private final String sql; private final List parameterSpecifications; public BasicExecutor(HqlSqlWalker walker, Queryable persister) { super(walker, null); this.persister = persister; try { SqlGenerator gen = new SqlGenerator( getFactory() ); gen.statement( walker.getAST() ); sql = gen.getSQL(); gen.getParseErrorHandler().throwQueryException(); parameterSpecifications = gen.getCollectedParameters(); } catch ( RecognitionException e ) { throw QuerySyntaxException.convert( e ); } } public String[] getSqlStatements() { return new String[] { sql }; } public int execute(QueryParameters parameters, SessionImplementor session) throws HibernateException { coordinateSharedCacheCleanup( session ); PreparedStatement st = null; RowSelection selection = parameters.getRowSelection(); try { try { st = session.getTransactionCoordinator().getJdbcCoordinator().getStatementPreparer().prepareStatement( sql, false ); Iterator parameterSpecifications = this.parameterSpecifications.iterator(); int pos = 1; while ( parameterSpecifications.hasNext() ) { final ParameterSpecification paramSpec = ( ParameterSpecification ) parameterSpecifications.next(); pos += paramSpec.bind( st, parameters, session, pos ); } if ( selection != null ) { if ( selection.getTimeout() != null ) { st.setQueryTimeout( selection.getTimeout().intValue() ); } } return st.executeUpdate(); } finally { if ( st != null ) { st.close(); } } } catch( SQLException sqle ) { throw getFactory().getSQLExceptionHelper().convert( sqle, "could not execute update query", sql ); } } @Override protected Queryable[] getAffectedQueryables() { return new Queryable[] { persister }; } }