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

📄 querytranslatorimpl.java

📁 一个Java持久层类库
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
	private Queryable getEntityPersisterForName(String name) throws QueryException {		String type = getType( name );		Queryable persister = getEntityPersister( type );		if ( persister == null ) throw new QueryException( "persistent class not found: " + type );		return persister;	}	Queryable getEntityPersisterUsingImports(String className) {		final String importedClassName = getFactory().getImportedClassName( className );		if ( importedClassName == null ) {			return null;		}		try {			return ( Queryable ) getFactory().getEntityPersister( importedClassName );		}		catch ( MappingException me ) {			return null;		}	}	Queryable getEntityPersister(String entityName) throws QueryException {		try {			return ( Queryable ) getFactory().getEntityPersister( entityName );		}		catch ( Exception e ) {			throw new QueryException( "persistent class not found: " + entityName );		}	}	QueryableCollection getCollectionPersister(String role) throws QueryException {		try {			return ( QueryableCollection ) getFactory().getCollectionPersister( role );		}		catch ( ClassCastException cce ) {			throw new QueryException( "collection role is not queryable: " + role );		}		catch ( Exception e ) {			throw new QueryException( "collection role not found: " + role );		}	}	void addType(String name, String type) {		typeMap.put( name, type );	}	void addCollection(String name, String role) {		collections.put( name, role );	}	void addFrom(String name, String type, JoinSequence joinSequence)			throws QueryException {		addType( name, type );		addFrom( name, joinSequence );	}	void addFromCollection(String name, String collectionRole, JoinSequence joinSequence)			throws QueryException {		//register collection role		addCollection( name, collectionRole );		addJoin( name, joinSequence );	}	void addFrom(String name, JoinSequence joinSequence)			throws QueryException {		fromTypes.add( name );		addJoin( name, joinSequence );	}	void addFromClass(String name, Queryable classPersister)			throws QueryException {		JoinSequence joinSequence = new JoinSequence( getFactory() )				.setRoot( classPersister, name );		//crossJoins.add(name);		addFrom( name, classPersister.getEntityName(), joinSequence );	}	void addSelectClass(String name) {		returnedTypes.add( name );	}	void addSelectScalar(Type type) {		scalarTypes.add( type );	}	void appendWhereToken(String token) {		whereTokens.add( token );	}	void appendHavingToken(String token) {		havingTokens.add( token );	}	void appendOrderByToken(String token) {		orderByTokens.add( token );	}	void appendGroupByToken(String token) {		groupByTokens.add( token );	}	void appendScalarSelectToken(String token) {		scalarSelectTokens.add( token );	}	void appendScalarSelectTokens(String[] tokens) {		scalarSelectTokens.add( tokens );	}	void addFromJoinOnly(String name, JoinSequence joinSequence) throws QueryException {		addJoin( name, joinSequence.getFromPart() );	}	void addJoin(String name, JoinSequence joinSequence) throws QueryException {		if ( !joins.containsKey( name ) ) joins.put( name, joinSequence );	}	void addNamedParameter(String name) {		if ( superQuery != null ) superQuery.addNamedParameter( name );		Integer loc = new Integer( parameterCount++ );		Object o = namedParameters.get( name );		if ( o == null ) {			namedParameters.put( name, loc );		}		else if ( o instanceof Integer ) {			ArrayList list = new ArrayList( 4 );			list.add( o );			list.add( loc );			namedParameters.put( name, list );		}		else {			( ( ArrayList ) o ).add( loc );		}	}	public int[] getNamedParameterLocs(String name) throws QueryException {		Object o = namedParameters.get( name );		if ( o == null ) {			QueryException qe = new QueryException( ERROR_NAMED_PARAMETER_DOES_NOT_APPEAR + name );			qe.setQueryString( queryString );			throw qe;		}		if ( o instanceof Integer ) {			return new int[]{ ( ( Integer ) o ).intValue() };		}		else {			return ArrayHelper.toIntArray( ( ArrayList ) o );		}	}	private void renderSQL() throws QueryException, MappingException {		final int rtsize;		if ( returnedTypes.size() == 0 && scalarTypes.size() == 0 ) {			//ie no select clause in HQL			returnedTypes = fromTypes;			rtsize = returnedTypes.size();		}		else {			rtsize = returnedTypes.size();			Iterator iter = entitiesToFetch.iterator();			while ( iter.hasNext() ) {				returnedTypes.add( iter.next() );			}		}		int size = returnedTypes.size();		persisters = new Queryable[size];		names = new String[size];		owners = new int[size];		ownerAssociationTypes = new EntityType[size];		suffixes = new String[size];		includeInSelect = new boolean[size];		for ( int i = 0; i < size; i++ ) {			String name = ( String ) returnedTypes.get( i );			//if ( !isName(name) ) throw new QueryException("unknown type: " + name);			persisters[i] = getEntityPersisterForName( name );			// TODO: cannot use generateSuffixes() - it handles the initial suffix differently.			suffixes[i] = ( size == 1 ) ? "" : Integer.toString( i ) + '_';			names[i] = name;			includeInSelect[i] = !entitiesToFetch.contains( name );			if ( includeInSelect[i] ) selectLength++;			if ( name.equals( collectionOwnerName ) ) collectionOwnerColumn = i;			String oneToOneOwner = ( String ) oneToOneOwnerNames.get( name );			owners[i] = ( oneToOneOwner == null ) ? -1 : returnedTypes.indexOf( oneToOneOwner );			ownerAssociationTypes[i] = (EntityType) uniqueKeyOwnerReferences.get( name );		}		if ( ArrayHelper.isAllNegative( owners ) ) owners = null;		String scalarSelect = renderScalarSelect(); //Must be done here because of side-effect! yuck...		int scalarSize = scalarTypes.size();		hasScalars = scalarTypes.size() != rtsize;		returnTypes = new Type[scalarSize];		for ( int i = 0; i < scalarSize; i++ ) {			returnTypes[i] = ( Type ) scalarTypes.get( i );		}		QuerySelect sql = new QuerySelect( getFactory().getDialect() );		sql.setDistinct( distinct );		if ( !shallowQuery ) {			renderIdentifierSelect( sql );			renderPropertiesSelect( sql );		}		if ( collectionPersister != null ) {			sql.addSelectFragmentString( collectionPersister.selectFragment( fetchName, "__" ) );		}		if ( hasScalars || shallowQuery ) sql.addSelectFragmentString( scalarSelect );		//TODO: for some dialects it would be appropriate to add the renderOrderByPropertiesSelect() to other select strings		mergeJoins( sql.getJoinFragment() );		sql.setWhereTokens( whereTokens.iterator() );		sql.setGroupByTokens( groupByTokens.iterator() );		sql.setHavingTokens( havingTokens.iterator() );		sql.setOrderByTokens( orderByTokens.iterator() );		if ( collectionPersister != null && collectionPersister.hasOrdering() ) {			sql.addOrderBy( collectionPersister.getSQLOrderByString( fetchName ) );		}		scalarColumnNames = NameGenerator.generateColumnNames( returnTypes, getFactory() );		// initialize the Set of queried identifier spaces (ie. tables)		Iterator iter = collections.values().iterator();		while ( iter.hasNext() ) {			CollectionPersister p = getCollectionPersister( ( String ) iter.next() );			addQuerySpaces( p.getCollectionSpaces() );		}		iter = typeMap.keySet().iterator();		while ( iter.hasNext() ) {			Queryable p = getEntityPersisterForName( ( String ) iter.next() );			addQuerySpaces( p.getQuerySpaces() );		}		sqlString = sql.toQueryString();		if ( holderClass != null ) holderConstructor = ReflectHelper.getConstructor( holderClass, returnTypes );		if ( hasScalars ) {			actualReturnTypes = returnTypes;		}		else {			actualReturnTypes = new Type[selectLength];			int j = 0;			for ( int i = 0; i < persisters.length; i++ ) {				if ( includeInSelect[i] ) {					actualReturnTypes[j++] = TypeFactory.manyToOne( persisters[i].getEntityName(), shallowQuery );				}			}		}	}	private void renderIdentifierSelect(QuerySelect sql) {		int size = returnedTypes.size();		for ( int k = 0; k < size; k++ ) {			String name = ( String ) returnedTypes.get( k );			String suffix = size == 1 ? "" : Integer.toString( k ) + '_';			sql.addSelectFragmentString( persisters[k].identifierSelectFragment( name, suffix ) );		}	}	/*private String renderOrderByPropertiesSelect() {		StringBuffer buf = new StringBuffer(10);		//add the columns we are ordering by to the select ID select clause		Iterator iter = orderByTokens.iterator();		while ( iter.hasNext() ) {			String token = (String) iter.next();			if ( token.lastIndexOf(".") > 0 ) {				//ie. it is of form "foo.bar", not of form "asc" or "desc"				buf.append(StringHelper.COMMA_SPACE).append(token);			}		}		return buf.toString();	}*/	private void renderPropertiesSelect(QuerySelect sql) {		int size = returnedTypes.size();		for ( int k = 0; k < size; k++ ) {			String suffix = size == 1 ? "" : Integer.toString( k ) + '_';			String name = ( String ) returnedTypes.get( k );			sql.addSelectFragmentString( persisters[k].propertySelectFragment( name, suffix, false ) );		}	}	/**	 * WARNING: side-effecty	 */	private String renderScalarSelect() {		boolean isSubselect = superQuery != null;		StringBuffer buf = new StringBuffer( 20 );		if ( scalarTypes.size() == 0 ) {			//ie. no select clause			int size = returnedTypes.size();			for ( int k = 0; k < size; k++ ) {				scalarTypes.add( TypeFactory.manyToOne( persisters[k].getEntityName(), shallowQuery ) );				String[] idColumnNames = persisters[k].getIdentifierColumnNames();				for ( int i = 0; i < idColumnNames.length; i++ ) {					buf.append( returnedTypes.get( k ) ).append( '.' ).append( idColumnNames[i] );					if ( !isSubselect ) buf.append( " as " ).append( NameGenerator.scalarName( k, i ) );					if ( i != idColumnNames.length - 1 || k != size - 1 ) buf.append( ", " );				}			}		}		else {			//there _was_ a select clause			Iterator iter = scalarSelectTokens.iterator();			int c = 0;			boolean nolast = false; //real hacky...			int parenCount = 0; // used to count the nesting of parentheses			while ( iter.hasNext() ) {				Object next = iter.next();				if ( next instanceof String ) {					String token = ( String ) next;					if ( "(".equals( token ) ) {						parenCount++;					}					else if ( ")".equals( token ) ) {						parenCount--;					}					String lc = token.toLowerCase();					if ( lc.equals( ", " ) ) {						if ( nolast ) {							nolast = false;						}						else {							if ( !isSubselect && parenCount == 0 ) {								int x = c++;								buf.append( " as " )										.append( NameGenerator.scalarName( x, 0 ) );							}						}					}					buf.append( token );					if ( lc.equals( "distinct" ) || lc.equals( "all" ) ) {						buf.append( ' ' );					}				}				else {					nolast = true;					String[] tokens = ( String[] ) next;					for ( int i = 0; i < tokens.length; i++ ) {						buf.append( tokens[i] );						if ( !isSubselect ) {							buf.append( " as " )									.append( NameGenerator.scalarName( c, i ) );						}						if ( i != tokens.length - 1 ) buf.append( ", " );					}					c++;				}			}			if ( !isSubselect && !nolast ) {				int x = c++;				buf.append( " as " )						.append( NameGenerator.scalarName( x, 0 ) );			}		}		return buf.toString();	}	private void mergeJoins(JoinFragment ojf) throws MappingException, QueryException {		Iterator iter = joins.entrySet().iterator();		while ( iter.hasNext() ) {			Map.Entry me = ( Map.Entry ) iter.next();			String name = ( String ) me.getKey();

⌨️ 快捷键说明

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