📄 querytranslatorimpl.java
字号:
JoinSequence join = ( JoinSequence ) me.getValue(); join.setSelector( new JoinSequence.Selector() { public boolean includeSubclasses(String alias) { boolean include = returnedTypes.contains( alias ) && !isShallowQuery(); return include; } } ); if ( typeMap.containsKey( name ) ) { ojf.addFragment( join.toJoinFragment( enabledFilters, true ) ); } else if ( collections.containsKey( name ) ) { ojf.addFragment( join.toJoinFragment( enabledFilters, true ) ); } else { //name from a super query (a bit inelegant that it shows up here) } } } public final Set getQuerySpaces() { return querySpaces; } /** * Is this query called by scroll() or iterate()? * * @return true if it is, false if it is called by find() or list() */ boolean isShallowQuery() { return shallowQuery; } void addQuerySpaces(Serializable[] spaces) { for ( int i = 0; i < spaces.length; i++ ) { querySpaces.add( spaces[i] ); } if ( superQuery != null ) superQuery.addQuerySpaces( spaces ); } void setDistinct(boolean distinct) { this.distinct = distinct; } boolean isSubquery() { return superQuery != null; } /** * Overrides method from Loader */ public CollectionPersister[] getCollectionPersisters() { return collectionPersister == null ? null : new CollectionPersister[] { collectionPersister }; } protected String[] getCollectionSuffixes() { return collectionPersister == null ? null : new String[] { "__" }; } void setCollectionToFetch(String role, String name, String ownerName, String entityName) throws QueryException { fetchName = name; collectionPersister = getCollectionPersister( role ); collectionOwnerName = ownerName; if ( collectionPersister.getElementType().isEntityType() ) { addEntityToFetch( entityName ); } } protected String[] getSuffixes() { return suffixes; } protected String[] getAliases() { return names; } /** * Used for collection filters */ private void addFromAssociation(final String elementName, final String collectionRole) throws QueryException { //q.addCollection(collectionName, collectionRole); QueryableCollection persister = getCollectionPersister( collectionRole ); Type collectionElementType = persister.getElementType(); if ( !collectionElementType.isEntityType() ) { throw new QueryException( "collection of values in filter: " + elementName ); } String[] keyColumnNames = persister.getKeyColumnNames(); //if (keyColumnNames.length!=1) throw new QueryException("composite-key collection in filter: " + collectionRole); String collectionName; JoinSequence join = new JoinSequence( getFactory() ); collectionName = persister.isOneToMany() ? elementName : createNameForCollection( collectionRole ); join.setRoot( persister, collectionName ); if ( !persister.isOneToMany() ) { //many-to-many addCollection( collectionName, collectionRole ); try { join.addJoin( ( AssociationType ) persister.getElementType(), elementName, JoinFragment.INNER_JOIN, persister.getElementColumnNames(collectionName) ); } catch ( MappingException me ) { throw new QueryException( me ); } } join.addCondition( collectionName, keyColumnNames, " = ?" ); //if ( persister.hasWhere() ) join.addCondition( persister.getSQLWhereString(collectionName) ); EntityType elemType = ( EntityType ) collectionElementType; addFrom( elementName, elemType.getAssociatedEntityName(), join ); } String getPathAlias(String path) { return ( String ) pathAliases.get( path ); } JoinSequence getPathJoin(String path) { return ( JoinSequence ) pathJoins.get( path ); } void addPathAliasAndJoin(String path, String alias, JoinSequence joinSequence) { pathAliases.put( path, alias ); pathJoins.put( path, joinSequence ); } public List list(SessionImplementor session, QueryParameters queryParameters) throws HibernateException { return list( session, queryParameters, getQuerySpaces(), actualReturnTypes ); } /** * Return the query results as an iterator */ public Iterator iterate(QueryParameters queryParameters, EventSource session) throws HibernateException { boolean stats = session.getFactory().getStatistics().isStatisticsEnabled(); long startTime = 0; if ( stats ) startTime = System.currentTimeMillis(); try { PreparedStatement st = prepareQueryStatement( queryParameters, false, session ); ResultSet rs = getResultSet( st, queryParameters.hasAutoDiscoverScalarTypes(), false, queryParameters.getRowSelection(), session ); HolderInstantiator hi = HolderInstantiator.createClassicHolderInstantiator(holderConstructor, queryParameters.getResultTransformer()); Iterator result = new IteratorImpl( rs, st, session, returnTypes, getColumnNames(), hi ); if ( stats ) { session.getFactory().getStatisticsImplementor().queryExecuted( "HQL: " + queryString, 0, System.currentTimeMillis() - startTime ); } return result; } catch ( SQLException sqle ) { throw JDBCExceptionHelper.convert( getFactory().getSQLExceptionConverter(), sqle, "could not execute query using iterate", getSQLString() ); } } public int executeUpdate(QueryParameters queryParameters, SessionImplementor session) throws HibernateException { throw new UnsupportedOperationException( "Not supported! Use the AST translator..."); } protected Object getResultColumnOrRow(Object[] row, ResultTransformer transformer, ResultSet rs, SessionImplementor session) throws SQLException, HibernateException { row = toResultRow( row ); if ( hasScalars ) { String[][] scalarColumns = getColumnNames(); int queryCols = returnTypes.length; if ( holderClass == null && queryCols == 1 ) { return returnTypes[0].nullSafeGet( rs, scalarColumns[0], session, null ); } else { row = new Object[queryCols]; for ( int i = 0; i < queryCols; i++ ) row[i] = returnTypes[i].nullSafeGet( rs, scalarColumns[i], session, null ); return row; } } else if ( holderClass == null ) { return row.length == 1 ? row[0] : row; } else { return row; } } protected List getResultList(List results, ResultTransformer resultTransformer) throws QueryException { if ( holderClass != null ) { for ( int i = 0; i < results.size(); i++ ) { Object[] row = ( Object[] ) results.get( i ); try { results.set( i, holderConstructor.newInstance( row ) ); } catch ( Exception e ) { throw new QueryException( "could not instantiate: " + holderClass, e ); } } } return results; } 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; } } void setHolderClass(Class clazz) { holderClass = clazz; } protected LockMode[] getLockModes(Map lockModes) { // unfortunately this stuff can't be cached because // it is per-invocation, not constant for the // QueryTranslator instance HashMap nameLockModes = new HashMap(); if ( lockModes != null ) { Iterator iter = lockModes.entrySet().iterator(); while ( iter.hasNext() ) { Map.Entry me = ( Map.Entry ) iter.next(); nameLockModes.put( getAliasName( ( String ) me.getKey() ), me.getValue() ); } } LockMode[] lockModeArray = new LockMode[names.length]; for ( int i = 0; i < names.length; i++ ) { LockMode lm = ( LockMode ) nameLockModes.get( names[i] ); if ( lm == null ) lm = LockMode.NONE; lockModeArray[i] = lm; } return lockModeArray; } protected String applyLocks(String sql, Map lockModes, Dialect dialect) throws QueryException { // can't cache this stuff either (per-invocation) final String result; if ( lockModes == null || lockModes.size() == 0 ) { result = sql; } else { Map aliasedLockModes = new HashMap(); Iterator iter = lockModes.entrySet().iterator(); while ( iter.hasNext() ) { Map.Entry me = ( Map.Entry ) iter.next(); aliasedLockModes.put( getAliasName( ( String ) me.getKey() ), me.getValue() ); } Map keyColumnNames = null; if ( dialect.forUpdateOfColumns() ) { keyColumnNames = new HashMap(); for ( int i = 0; i < names.length; i++ ) { keyColumnNames.put( names[i], persisters[i].getIdentifierColumnNames() ); } } result = dialect.applyLocksToSql( sql, aliasedLockModes, keyColumnNames ); } logQuery( queryString, result ); return result; } protected boolean upgradeLocks() { return true; } protected int[] getCollectionOwners() { return new int[] { collectionOwnerColumn }; } protected boolean isCompiled() { return compiled; } public String toString() { return queryString; } protected int[] getOwners() { return owners; } protected EntityType[] getOwnerAssociationTypes() { return ownerAssociationTypes; } public Class getHolderClass() { return holderClass; } public Map getEnabledFilters() { return enabledFilters; } public ScrollableResults scroll(final QueryParameters queryParameters, final SessionImplementor session) throws HibernateException { HolderInstantiator hi = HolderInstantiator.createClassicHolderInstantiator(holderConstructor, queryParameters.getResultTransformer()); return scroll( queryParameters, returnTypes, hi, session ); } public String getQueryIdentifier() { return queryIdentifier; } protected boolean isSubselectLoadingEnabled() { return hasSubselectLoadableCollections(); } public void validateScrollability() throws HibernateException { // This is the legacy behaviour for HQL queries... if ( getCollectionPersisters() != null ) { throw new HibernateException( "Cannot scroll queries which initialize collections" ); } } public boolean containsCollectionFetches() { return false; } public boolean isManipulationStatement() { // classic parser does not support bulk manipulation statements return false; } public ParameterTranslations getParameterTranslations() { return new ParameterTranslations() { public boolean supportsOrdinalParameterMetadata() { // classic translator does not support collection of ordinal // param metadata return false; } public int getOrdinalParameterCount() { return 0; // not known! } public int getOrdinalParameterSqlLocation(int ordinalPosition) { return 0; // not known! } public Type getOrdinalParameterExpectedType(int ordinalPosition) { return null; // not known! } public Set getNamedParameterNames() { return namedParameters.keySet(); } public int[] getNamedParameterSqlLocations(String name) { return getNamedParameterLocs( name ); } public Type getNamedParameterExpectedType(String name) { return null; // not known! } }; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -