Java Code Examples for org.hibernate.sql.Select#setFromClause()

The following examples show how to use org.hibernate.sql.Select#setFromClause() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: AbstractEntityPersister.java    From lams with GNU General Public License v2.0 5 votes vote down vote up
protected String renderSelect(
		final int[] tableNumbers,
		final int[] columnNumbers,
		final int[] formulaNumbers) {

	Arrays.sort( tableNumbers ); //get 'em in the right order (not that it really matters)

	//render the where and from parts
	int drivingTable = tableNumbers[0];
	final String drivingAlias = generateTableAlias(
			getRootAlias(),
			drivingTable
	); //we *could* regerate this inside each called method!
	final String where = createWhereByKey( drivingTable, drivingAlias );
	final String from = createFrom( drivingTable, drivingAlias );

	//now render the joins
	JoinFragment jf = createJoin( tableNumbers, drivingAlias );

	//now render the select clause
	SelectFragment selectFragment = createSelect( columnNumbers, formulaNumbers );

	//now tie it all together
	Select select = new Select( getFactory().getDialect() );
	select.setSelectClause( selectFragment.toFragmentString().substring( 2 ) );
	select.setFromClause( from );
	select.setWhereClause( where );
	select.setOuterJoins( jf.toFromFragmentString(), jf.toWhereFragmentString() );
	if ( getFactory().getSessionFactoryOptions().isCommentsEnabled() ) {
		select.setComment( "sequential select " + getEntityName() );
	}
	return select.toStatementString();
}
 
Example 2
Source File: AbstractTableBasedBulkIdHandler.java    From lams with GNU General Public License v2.0 5 votes vote down vote up
protected Select generateIdSelect(
		String tableAlias,
		ProcessedWhereClause whereClause) {

	final Dialect dialect = sessionFactory.getJdbcServices().getJdbcEnvironment().getDialect();

	final Select select = new Select( dialect );
	final SelectValues selectClause = new SelectValues( dialect ).addColumns(
			tableAlias,
			getTargetedQueryable().getIdentifierColumnNames(),
			getTargetedQueryable().getIdentifierColumnNames()
	);
	addAnyExtraIdSelectValues( selectClause );
	select.setSelectClause( selectClause.render() );

	String rootTableName = getTargetedQueryable().getTableName();
	String fromJoinFragment = getTargetedQueryable().fromJoinFragment( tableAlias, true, false );
	String whereJoinFragment = getTargetedQueryable().whereJoinFragment( tableAlias, true, false );

	select.setFromClause( rootTableName + ' ' + tableAlias + fromJoinFragment );

	if ( whereJoinFragment == null ) {
		whereJoinFragment = "";
	}
	else {
		whereJoinFragment = whereJoinFragment.trim();
		if ( whereJoinFragment.startsWith( "and" ) ) {
			whereJoinFragment = whereJoinFragment.substring( 4 );
		}
	}

	if ( whereClause.getUserWhereClauseFragment().length() > 0 ) {
		if ( whereJoinFragment.length() > 0 ) {
			whereJoinFragment += " and ";
		}
	}
	select.setWhereClause( whereJoinFragment + whereClause.getUserWhereClauseFragment() );
	return select;
}
 
Example 3
Source File: AbstractEntityPersister.java    From cacheonix-core with GNU Lesser General Public License v2.1 5 votes vote down vote up
protected String renderSelect(
		final int[] tableNumbers,
        final int[] columnNumbers,
        final int[] formulaNumbers) {

	Arrays.sort( tableNumbers ); //get 'em in the right order (not that it really matters)

	//render the where and from parts
	int drivingTable = tableNumbers[0];
	final String drivingAlias = generateTableAlias( getRootAlias(), drivingTable ); //we *could* regerate this inside each called method!
	final String where = createWhereByKey( drivingTable, drivingAlias );
	final String from = createFrom( drivingTable, drivingAlias );

	//now render the joins
	JoinFragment jf = createJoin( tableNumbers, drivingAlias );

	//now render the select clause
	SelectFragment selectFragment = createSelect( columnNumbers, formulaNumbers );

	//now tie it all together
	Select select = new Select( getFactory().getDialect() );
	select.setSelectClause( selectFragment.toFragmentString().substring( 2 ) );
	select.setFromClause( from );
	select.setWhereClause( where );
	select.setOuterJoins( jf.toFromFragmentString(), jf.toWhereFragmentString() );
	if ( getFactory().getSettings().isCommentsEnabled() ) {
		select.setComment( "sequential select " + getEntityName() );
	}
	return select.toStatementString();
}
 
Example 4
Source File: AbstractEntityPersister.java    From lams with GNU General Public License v2.0 4 votes vote down vote up
protected String generateIdByUniqueKeySelectString(String uniquePropertyName) {
	Select select = new Select( getFactory().getDialect() );

	if ( getFactory().getSessionFactoryOptions().isCommentsEnabled() ) {
		select.setComment( "resolve id by unique property [" + getEntityName() + "." + uniquePropertyName + "]" );
	}

	final String rooAlias = getRootAlias();

	select.setFromClause( fromTableFragment( rooAlias ) + fromJoinFragment( rooAlias, true, false ) );

	SelectFragment selectFragment = new SelectFragment();
	selectFragment.addColumns( rooAlias, getIdentifierColumnNames(), getIdentifierAliases() );
	select.setSelectClause( selectFragment );

	StringBuilder whereClauseBuffer = new StringBuilder();
	final int uniquePropertyIndex = getSubclassPropertyIndex( uniquePropertyName );
	final String uniquePropertyTableAlias = generateTableAlias(
			rooAlias,
			getSubclassPropertyTableNumber( uniquePropertyIndex )
	);
	String sep = "";
	for ( String columnTemplate : getSubclassPropertyColumnReaderTemplateClosure()[uniquePropertyIndex] ) {
		if ( columnTemplate == null ) {
			continue;
		}
		final String columnReference = StringHelper.replace(
				columnTemplate,
				Template.TEMPLATE,
				uniquePropertyTableAlias
		);
		whereClauseBuffer.append( sep ).append( columnReference ).append( "=?" );
		sep = " and ";
	}
	for ( String formulaTemplate : getSubclassPropertyFormulaTemplateClosure()[uniquePropertyIndex] ) {
		if ( formulaTemplate == null ) {
			continue;
		}
		final String formulaReference = StringHelper.replace(
				formulaTemplate,
				Template.TEMPLATE,
				uniquePropertyTableAlias
		);
		whereClauseBuffer.append( sep ).append( formulaReference ).append( "=?" );
		sep = " and ";
	}
	whereClauseBuffer.append( whereJoinFragment( rooAlias, true, false ) );

	select.setWhereClause( whereClauseBuffer.toString() );

	return select.setOuterJoins( "", "" ).toStatementString();
}
 
Example 5
Source File: AbstractEntityPersister.java    From lams with GNU General Public License v2.0 4 votes vote down vote up
public Object[] getNaturalIdentifierSnapshot(Serializable id, SharedSessionContractImplementor session)
		throws HibernateException {
	if ( !hasNaturalIdentifier() ) {
		throw new MappingException(
				"persistent class did not define a natural-id : " + MessageHelper.infoString(
						this
				)
		);
	}
	if ( LOG.isTraceEnabled() ) {
		LOG.tracev(
				"Getting current natural-id snapshot state for: {0}",
				MessageHelper.infoString( this, id, getFactory() )
		);
	}

	int[] naturalIdPropertyIndexes = getNaturalIdentifierProperties();
	int naturalIdPropertyCount = naturalIdPropertyIndexes.length;
	boolean[] naturalIdMarkers = new boolean[getPropertySpan()];
	Type[] extractionTypes = new Type[naturalIdPropertyCount];
	for ( int i = 0; i < naturalIdPropertyCount; i++ ) {
		extractionTypes[i] = getPropertyTypes()[naturalIdPropertyIndexes[i]];
		naturalIdMarkers[naturalIdPropertyIndexes[i]] = true;
	}

	///////////////////////////////////////////////////////////////////////
	// TODO : look at perhaps caching this...
	Select select = new Select( getFactory().getDialect() );
	if ( getFactory().getSessionFactoryOptions().isCommentsEnabled() ) {
		select.setComment( "get current natural-id state " + getEntityName() );
	}
	select.setSelectClause( concretePropertySelectFragmentSansLeadingComma( getRootAlias(), naturalIdMarkers ) );
	select.setFromClause( fromTableFragment( getRootAlias() ) + fromJoinFragment( getRootAlias(), true, false ) );

	String[] aliasedIdColumns = StringHelper.qualify( getRootAlias(), getIdentifierColumnNames() );
	String whereClause = new StringBuilder()
			.append(
					String.join(
							"=? and ",
							aliasedIdColumns
					)
			)
			.append( "=?" )
			.append( whereJoinFragment( getRootAlias(), true, false ) )
			.toString();

	String sql = select.setOuterJoins( "", "" )
			.setWhereClause( whereClause )
			.toStatementString();
	///////////////////////////////////////////////////////////////////////

	Object[] snapshot = new Object[naturalIdPropertyCount];
	try {
		PreparedStatement ps = session
				.getJdbcCoordinator()
				.getStatementPreparer()
				.prepareStatement( sql );
		try {
			getIdentifierType().nullSafeSet( ps, id, 1, session );
			ResultSet rs = session.getJdbcCoordinator().getResultSetReturn().extract( ps );
			try {
				//if there is no resulting row, return null
				if ( !rs.next() ) {
					return null;
				}
				final EntityKey key = session.generateEntityKey( id, this );
				Object owner = session.getPersistenceContext().getEntity( key );
				for ( int i = 0; i < naturalIdPropertyCount; i++ ) {
					snapshot[i] = extractionTypes[i].hydrate(
							rs, getPropertyAliases(
									"",
									naturalIdPropertyIndexes[i]
							), session, null
					);
					if ( extractionTypes[i].isEntityType() ) {
						snapshot[i] = extractionTypes[i].resolve( snapshot[i], session, owner );
					}
				}
				return snapshot;
			}
			finally {
				session.getJdbcCoordinator().getResourceRegistry().release( rs, ps );
			}
		}
		finally {
			session.getJdbcCoordinator().getResourceRegistry().release( ps );
			session.getJdbcCoordinator().afterStatementExecution();
		}
	}
	catch (SQLException e) {
		throw getFactory().getSQLExceptionHelper().convert(
				e,
				"could not retrieve snapshot: " + MessageHelper.infoString( this, id, getFactory() ),
				sql
		);
	}
}
 
Example 6
Source File: AbstractEntityPersister.java    From lams with GNU General Public License v2.0 4 votes vote down vote up
private String generateEntityIdByNaturalIdSql(boolean[] valueNullness) {
	EntityPersister rootPersister = getFactory().getEntityPersister( getRootEntityName() );
	if ( rootPersister != this ) {
		if ( rootPersister instanceof AbstractEntityPersister ) {
			return ( (AbstractEntityPersister) rootPersister ).generateEntityIdByNaturalIdSql( valueNullness );
		}
	}

	Select select = new Select( getFactory().getDialect() );
	if ( getFactory().getSessionFactoryOptions().isCommentsEnabled() ) {
		select.setComment( "get current natural-id->entity-id state " + getEntityName() );
	}

	final String rootAlias = getRootAlias();

	select.setSelectClause( identifierSelectFragment( rootAlias, "" ) );
	select.setFromClause( fromTableFragment( rootAlias ) + fromJoinFragment( rootAlias, true, false ) );

	final StringBuilder whereClause = new StringBuilder();
	final int[] propertyTableNumbers = getPropertyTableNumbers();
	final int[] naturalIdPropertyIndexes = this.getNaturalIdentifierProperties();
	int valuesIndex = -1;
	for ( int propIdx = 0; propIdx < naturalIdPropertyIndexes.length; propIdx++ ) {
		valuesIndex++;
		if ( propIdx > 0 ) {
			whereClause.append( " and " );
		}

		final int naturalIdIdx = naturalIdPropertyIndexes[propIdx];
		final String tableAlias = generateTableAlias( rootAlias, propertyTableNumbers[naturalIdIdx] );
		final String[] propertyColumnNames = getPropertyColumnNames( naturalIdIdx );
		final String[] aliasedPropertyColumns = StringHelper.qualify( tableAlias, propertyColumnNames );

		if ( valueNullness != null && valueNullness[valuesIndex] ) {
			whereClause.append( String.join( " is null and ", aliasedPropertyColumns ) ).append( " is null" );
		}
		else {
			whereClause.append( String.join( "=? and ", aliasedPropertyColumns ) ).append( "=?" );
		}
	}

	whereClause.append( whereJoinFragment( getRootAlias(), true, false ) );

	return select.setOuterJoins( "", "" ).setWhereClause( whereClause.toString() ).toStatementString();
}
 
Example 7
Source File: AbstractEntityPersister.java    From cacheonix-core with GNU Lesser General Public License v2.1 4 votes vote down vote up
public Object[] getNaturalIdentifierSnapshot(Serializable id, SessionImplementor session) throws HibernateException {
	if ( !hasNaturalIdentifier() ) {
		throw new MappingException( "persistent class did not define a natural-id : " + MessageHelper.infoString( this ) );
	}
	if ( log.isTraceEnabled() ) {
		log.trace( "Getting current natural-id snapshot state for: " + MessageHelper.infoString( this, id, getFactory() ) );
	}

	int[] naturalIdPropertyIndexes = getNaturalIdentifierProperties();
	int naturalIdPropertyCount = naturalIdPropertyIndexes.length;
	boolean[] naturalIdMarkers = new boolean[ getPropertySpan() ];
	Type[] extractionTypes = new Type[ naturalIdPropertyCount ];
	for ( int i = 0; i < naturalIdPropertyCount; i++ ) {
		extractionTypes[i] = getPropertyTypes()[ naturalIdPropertyIndexes[i] ];
		naturalIdMarkers[ naturalIdPropertyIndexes[i] ] = true;
	}

	///////////////////////////////////////////////////////////////////////
	// TODO : look at perhaps caching this...
	Select select = new Select( getFactory().getDialect() );
	if ( getFactory().getSettings().isCommentsEnabled() ) {
		select.setComment( "get current natural-id state " + getEntityName() );
	}
	select.setSelectClause( concretePropertySelectFragmentSansLeadingComma( getRootAlias(), naturalIdMarkers ) );
	select.setFromClause( fromTableFragment( getRootAlias() ) + fromJoinFragment( getRootAlias(), true, false ) );

	String[] aliasedIdColumns = StringHelper.qualify( getRootAlias(), getIdentifierColumnNames() );
	String whereClause = new StringBuffer()
		.append( StringHelper.join( "=? and ",
				aliasedIdColumns ) )
		.append( "=?" )
		.append( whereJoinFragment( getRootAlias(), true, false ) )
		.toString();

	String sql = select.setOuterJoins( "", "" )
			.setWhereClause( whereClause )
			.toStatementString();
	///////////////////////////////////////////////////////////////////////

	Object[] snapshot = new Object[ naturalIdPropertyCount ];
	try {
		PreparedStatement ps = session.getBatcher().prepareSelectStatement( sql );
		try {
			getIdentifierType().nullSafeSet( ps, id, 1, session );
			ResultSet rs = ps.executeQuery();
			try {
				//if there is no resulting row, return null
				if ( !rs.next() ) {
					return null;
				}

				for ( int i = 0; i < naturalIdPropertyCount; i++ ) {
					snapshot[i] = extractionTypes[i].hydrate( rs, getPropertyAliases( "", naturalIdPropertyIndexes[i] ), session, null );
				}
				return snapshot;
			}
			finally {
				rs.close();
			}
		}
		finally {
			session.getBatcher().closeStatement( ps );
		}
	}
	catch ( SQLException sqle ) {
		throw JDBCExceptionHelper.convert(
				getFactory().getSQLExceptionConverter(),
				sqle,
				"could not retrieve snapshot: " +
				MessageHelper.infoString( this, id, getFactory() ),
		        sql
			);
	}
}
 
Example 8
Source File: AbstractStatementExecutor.java    From cacheonix-core with GNU Lesser General Public License v2.1 4 votes vote down vote up
protected String generateIdInsertSelect(Queryable persister, String tableAlias, AST whereClause) {
	Select select = new Select( getFactory().getDialect() );
	SelectFragment selectFragment = new SelectFragment()
			.addColumns( tableAlias, persister.getIdentifierColumnNames(), persister.getIdentifierColumnNames() );
	select.setSelectClause( selectFragment.toFragmentString().substring( 2 ) );

	String rootTableName = persister.getTableName();
	String fromJoinFragment = persister.fromJoinFragment( tableAlias, true, false );
	String whereJoinFragment = persister.whereJoinFragment( tableAlias, true, false );

	select.setFromClause( rootTableName + ' ' + tableAlias + fromJoinFragment );

	if ( whereJoinFragment == null ) {
		whereJoinFragment = "";
	}
	else {
		whereJoinFragment = whereJoinFragment.trim();
		if ( whereJoinFragment.startsWith( "and" ) ) {
			whereJoinFragment = whereJoinFragment.substring( 4 );
		}
	}

	String userWhereClause = "";
	if ( whereClause.getNumberOfChildren() != 0 ) {
		// If a where clause was specified in the update/delete query, use it to limit the
		// returned ids here...
		try {
			SqlGenerator sqlGenerator = new SqlGenerator( getFactory() );
			sqlGenerator.whereClause( whereClause );
			userWhereClause = sqlGenerator.getSQL().substring( 7 );  // strip the " where "
		}
		catch ( RecognitionException e ) {
			throw new HibernateException( "Unable to generate id select for DML operation", e );
		}
		if ( whereJoinFragment.length() > 0 ) {
			whereJoinFragment += " and ";
		}
	}

	select.setWhereClause( whereJoinFragment + userWhereClause );

	InsertSelect insert = new InsertSelect( getFactory().getDialect() );
	if ( getFactory().getSettings().isCommentsEnabled() ) {
		insert.setComment( "insert-select for " + persister.getEntityName() + " ids" );
	}
	insert.setTableName( persister.getTemporaryIdTableName() );
	insert.setSelect( select );
	return insert.toStatementString();
}