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

📄 indexnode.java

📁 一个Java持久层类库
💻 JAVA
字号:
// $Id: IndexNode.java 7460 2005-07-12 20:27:29Z steveebersole $package org.hibernate.hql.ast.tree;import org.hibernate.QueryException;import org.hibernate.engine.JoinSequence;import org.hibernate.hql.ast.SqlGenerator;import org.hibernate.hql.ast.util.SessionFactoryHelper;import org.hibernate.persister.collection.QueryableCollection;import org.hibernate.type.CollectionType;import org.hibernate.type.Type;import antlr.RecognitionException;import antlr.SemanticException;import antlr.collections.AST;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * Represents the [] operator and provides it's semantics. * * @author josh Aug 14, 2004 7:07:10 AM */public class IndexNode extends FromReferenceNode {	private static final Logger log = LoggerFactory.getLogger( IndexNode.class );	public void setScalarColumnText(int i) throws SemanticException {		throw new UnsupportedOperationException( "An IndexNode cannot generate column text!" );	}	public void prepareForDot(String propertyName) throws SemanticException {		FromElement fromElement = getFromElement();		if ( fromElement == null ) {			throw new IllegalStateException( "No FROM element for index operator!" );		}		QueryableCollection queryableCollection = fromElement.getQueryableCollection();		if ( queryableCollection != null && !queryableCollection.isOneToMany() ) {			FromReferenceNode collectionNode = ( FromReferenceNode ) getFirstChild();			String path = collectionNode.getPath() + "[]." + propertyName;			if ( log.isDebugEnabled() ) {				log.debug( "Creating join for many-to-many elements for " + path );			}			FromElementFactory factory = new FromElementFactory( fromElement.getFromClause(), fromElement, path );			// This will add the new from element to the origin.			FromElement elementJoin = factory.createElementJoin( queryableCollection );			setFromElement( elementJoin );		}	}	public void resolveIndex(AST parent) throws SemanticException {		throw new UnsupportedOperationException();	}	public void resolve(boolean generateJoin, boolean implicitJoin, String classAlias, AST parent) 	throws SemanticException {		if ( isResolved() ) {			return;		}		FromReferenceNode collectionNode = ( FromReferenceNode ) getFirstChild();		SessionFactoryHelper sessionFactoryHelper = getSessionFactoryHelper();		collectionNode.resolveIndex( this );		// Fully resolve the map reference, create implicit joins.		Type type = collectionNode.getDataType();		if ( !type.isCollectionType() ) {			throw new SemanticException( "The [] operator cannot be applied to type " + type.toString() );		}		String collectionRole = ( ( CollectionType ) type ).getRole();		QueryableCollection queryableCollection = sessionFactoryHelper.requireQueryableCollection( collectionRole );		if ( !queryableCollection.hasIndex() ) {			throw new QueryException( "unindexed fromElement before []: " + collectionNode.getPath() );		}		// Generate the inner join -- The elements need to be joined to the collection they are in.		FromElement fromElement = collectionNode.getFromElement();		String elementTable = fromElement.getTableAlias();		FromClause fromClause = fromElement.getFromClause();		String path = collectionNode.getPath();		FromElement elem = fromClause.findCollectionJoin( path );		if ( elem == null ) {			FromElementFactory factory = new FromElementFactory( fromClause, fromElement, path );			elem = factory.createCollectionElementsJoin( queryableCollection, elementTable );			if ( log.isDebugEnabled() ) {				log.debug( "No FROM element found for the elements of collection join path " + path						+ ", created " + elem );			}		}		else {			if ( log.isDebugEnabled() ) {				log.debug( "FROM element found for collection join path " + path );			}		}		// Add the condition to the join sequence that qualifies the indexed element.		AST index = collectionNode.getNextSibling();	// The index should be a constant, which will have been processed already.		if ( index == null ) {			throw new QueryException( "No index value!" );		}		setFromElement( fromElement );							// The 'from element' that represents the elements of the collection.		// Sometimes use the element table alias, sometimes use the... umm... collection table alias (many to many)		String collectionTableAlias = elementTable;		if ( elem.getCollectionTableAlias() != null ) {			collectionTableAlias = elem.getCollectionTableAlias();		}		// TODO: get SQL rendering out of here, create an AST for the join expressions.		// Use the SQL generator grammar to generate the SQL text for the index expression.		JoinSequence joinSequence = fromElement.getJoinSequence();		String[] indexCols = queryableCollection.getIndexColumnNames();		if ( indexCols.length != 1 ) {			throw new QueryException( "composite-index appears in []: " + collectionNode.getPath() );		}		SqlGenerator gen = new SqlGenerator( getSessionFactoryHelper().getFactory() );		try {			gen.simpleExpr( index ); //TODO: used to be exprNoParens! was this needed?		}		catch ( RecognitionException e ) {			throw new QueryException( e.getMessage(), e );		}		String expression = gen.getSQL();		joinSequence.addCondition( collectionTableAlias + '.' + indexCols[0] + " = " + expression );		// Now, set the text for this node.  It should be the element columns.		String[] elementColumns = queryableCollection.getElementColumnNames( elementTable );		setText( elementColumns[0] );		setResolved();	}}

⌨️ 快捷键说明

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