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

📄 queryloader.java

📁 一个Java持久层类库
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
		}		else {			// unfortunately this stuff can't be cached because			// it is per-invocation, not constant for the			// QueryTranslator instance			LockMode[] lockModeArray = new LockMode[entityAliases.length];			for ( int i = 0; i < entityAliases.length; i++ ) {				LockMode lockMode = (LockMode) lockModes.get( entityAliases[i] );				if ( lockMode == null ) {					//NONE, because its the requested lock mode, not the actual! 					lockMode = LockMode.NONE;				}				lockModeArray[i] = lockMode;			}			return lockModeArray;		}	}	protected String applyLocks(String sql, Map lockModes, Dialect dialect) throws QueryException {		if ( lockModes == null || lockModes.size() == 0 ) {			return sql;		}		// can't cache this stuff either (per-invocation)		// we are given a map of user-alias -> lock mode		// create a new map of sql-alias -> lock mode		final Map aliasedLockModes = new HashMap();		final Map keyColumnNames = dialect.forUpdateOfColumns() ? new HashMap() : null;		final Iterator iter = lockModes.entrySet().iterator();		while ( iter.hasNext() ) {			Map.Entry me = ( Map.Entry ) iter.next();			final String userAlias = ( String ) me.getKey();			final String drivingSqlAlias = ( String ) sqlAliasByEntityAlias.get( userAlias );			if ( drivingSqlAlias == null ) {				throw new IllegalArgumentException( "could not locate alias to apply lock mode : " + userAlias );			}			// at this point we have (drivingSqlAlias) the SQL alias of the driving table			// corresponding to the given user alias.  However, the driving table is not			// (necessarily) the table against which we want to apply locks.  Mainly,			// the exception case here is joined-subclass hierarchies where we instead			// want to apply the lock against the root table (for all other strategies,			// it just happens that driving and root are the same).			final QueryNode select = ( QueryNode ) queryTranslator.getSqlAST();			final Lockable drivingPersister = ( Lockable ) select.getFromClause().getFromElement( userAlias ).getQueryable();			final String sqlAlias = drivingPersister.getRootTableAlias( drivingSqlAlias );			aliasedLockModes.put( sqlAlias, me.getValue() );			if ( keyColumnNames != null ) {				keyColumnNames.put( sqlAlias, drivingPersister.getRootTableIdentifierColumnNames() );			}		}		return dialect.applyLocksToSql( sql, aliasedLockModes, keyColumnNames );	}	protected boolean upgradeLocks() {		return true;	}	private boolean hasSelectNew() {		return selectNewTransformer!=null;	}	protected Object getResultColumnOrRow(Object[] row, ResultTransformer transformer, ResultSet rs, SessionImplementor session)			throws SQLException, HibernateException {		row = toResultRow( row );		boolean hasTransform = hasSelectNew() || transformer!=null;		if ( hasScalars ) {			String[][] scalarColumns = scalarColumnNames;			int queryCols = queryReturnTypes.length;			if ( !hasTransform && queryCols == 1 ) {				return queryReturnTypes[0].nullSafeGet( rs, scalarColumns[0], session, null );			}			else {				row = new Object[queryCols];				for ( int i = 0; i < queryCols; i++ ) {					row[i] = queryReturnTypes[i].nullSafeGet( rs, scalarColumns[i], session, null );				}				return row;			}		}		else if ( !hasTransform ) {			return row.length == 1 ? row[0] : row;		}		else {			return row;		}	}	protected List getResultList(List results, ResultTransformer resultTransformer) throws QueryException {		// meant to handle dynamic instantiation queries...		HolderInstantiator holderInstantiator = HolderInstantiator.getHolderInstantiator(selectNewTransformer, resultTransformer, queryReturnAliases);		if ( holderInstantiator.isRequired() ) {			for ( int i = 0; i < results.size(); i++ ) {				Object[] row = ( Object[] ) results.get( i );				Object result = holderInstantiator.instantiate(row);				results.set( i, result );			}			if(!hasSelectNew() && resultTransformer!=null) {				return resultTransformer.transformList(results);			} else {				return results;			}		} else {			return results;		}	}	// --- Query translator methods ---	public List list(			SessionImplementor session,			QueryParameters queryParameters) throws HibernateException {		checkQuery( queryParameters );		return list( session, queryParameters, queryTranslator.getQuerySpaces(), queryReturnTypes );	}	private void checkQuery(QueryParameters queryParameters) {		if ( hasSelectNew() && queryParameters.getResultTransformer() != null ) {			throw new QueryException( "ResultTransformer is not allowed for 'select new' queries." );		}	}	public Iterator iterate(			QueryParameters queryParameters,			EventSource session) throws HibernateException {		checkQuery( queryParameters );		final boolean stats = session.getFactory().getStatistics().isStatisticsEnabled();		long startTime = 0;		if ( stats ) {			startTime = System.currentTimeMillis();		}		try {			final PreparedStatement st = prepareQueryStatement( queryParameters, false, session );			if(queryParameters.isCallable()) {				throw new QueryException("iterate() not supported for callable statements");			}			final ResultSet rs = getResultSet(st, queryParameters.hasAutoDiscoverScalarTypes(), false, queryParameters.getRowSelection(), session);			final Iterator result = new IteratorImpl(					rs,			        st,			        session,			        queryReturnTypes,			        queryTranslator.getColumnNames(),			        HolderInstantiator.getHolderInstantiator(selectNewTransformer, queryParameters.getResultTransformer(), queryReturnAliases)				);			if ( stats ) {				session.getFactory().getStatisticsImplementor().queryExecuted(//						"HQL: " + queryTranslator.getQueryString(),						getQueryIdentifier(),						0,						System.currentTimeMillis() - startTime				);			}			return result;		}		catch ( SQLException sqle ) {			throw JDBCExceptionHelper.convert(					getFactory().getSQLExceptionConverter(),			        sqle,			        "could not execute query using iterate",			        getSQLString()				);		}	}	public ScrollableResults scroll(			final QueryParameters queryParameters,	        final SessionImplementor session) throws HibernateException {		checkQuery( queryParameters );		return scroll( queryParameters, queryReturnTypes, HolderInstantiator.getHolderInstantiator(selectNewTransformer, queryParameters.getResultTransformer(), queryReturnAliases), session );	}	// -- Implementation private methods --	private Object[] toResultRow(Object[] row) {		if ( selectLength == row.length ) {			return row;		}		else {			Object[] result = new Object[selectLength];			int j = 0;			for ( int i = 0; i < row.length; i++ ) {				if ( includeInSelect[i] ) {					result[j++] = row[i];				}			}			return result;		}	}	/**	 * Returns the locations of all occurrences of the named parameter.	 */	public int[] getNamedParameterLocs(String name) throws QueryException {		return queryTranslator.getParameterTranslations().getNamedParameterSqlLocations( name );	}	/**	 * We specifically override this method here, because in general we know much more	 * about the parameters and their appropriate bind positions here then we do in	 * our super because we track them explciitly here through the ParameterSpecification	 * interface.	 *	 * @param queryParameters The encapsulation of the parameter values to be bound.	 * @param startIndex The position from which to start binding parameter values.	 * @param session The originating session.	 * @return The number of JDBC bind positions actually bound during this method execution.	 * @throws SQLException Indicates problems performing the binding.	 */	protected int bindParameterValues(			final PreparedStatement statement,			final QueryParameters queryParameters,			final int startIndex,			final SessionImplementor session) throws SQLException {		int position = bindFilterParameterValues( statement, queryParameters, startIndex, session );		List parameterSpecs = queryTranslator.getSqlAST().getWalker().getParameters();		Iterator itr = parameterSpecs.iterator();		while ( itr.hasNext() ) {			ParameterSpecification spec = ( ParameterSpecification ) itr.next();			position += spec.bind( statement, queryParameters, session, position );		}		return position - startIndex;	}	private int bindFilterParameterValues(			PreparedStatement st,			QueryParameters queryParameters,			int position,			SessionImplementor session) throws SQLException {		// todo : better to handle dynamic filters through implicit DynamicFilterParameterSpecification		// see the discussion there in DynamicFilterParameterSpecification's javadocs as to why		// it is currently not done that way.		int filteredParamCount = queryParameters.getFilteredPositionalParameterTypes() == null				? 0				: queryParameters.getFilteredPositionalParameterTypes().length;		int nonfilteredParamCount = queryParameters.getPositionalParameterTypes() == null				? 0				: queryParameters.getPositionalParameterTypes().length;		int filterParamCount = filteredParamCount - nonfilteredParamCount;		for ( int i = 0; i < filterParamCount; i++ ) {			Type type = queryParameters.getFilteredPositionalParameterTypes()[i];			Object value = queryParameters.getFilteredPositionalParameterValues()[i];			type.nullSafeSet( st, value, position, session );			position += type.getColumnSpan( getFactory() );		}		return position;	}}

⌨️ 快捷键说明

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