📄 querytranslatorimpl.java
字号:
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 + -