All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hibernate.sql.results.spi.ListResultsConsumer Maven / Gradle / Ivy

There is a newer version: 7.0.0.Alpha3
Show newest version
/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later
 * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
 */
package org.hibernate.sql.results.spi;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.sql.results.internal.JdbcValuesSourceProcessingStateStandardImpl;
import org.hibernate.sql.results.internal.RowProcessingStateStandardImpl;

/**
 * @author Steve Ebersole
 */
public class ListResultsConsumer implements ResultsConsumer, R> {
	/**
	 * Singleton access
	 */
	public static final ListResultsConsumer INSTANCE = new ListResultsConsumer();

	@SuppressWarnings("unchecked")
	public static  ListResultsConsumer instance() {
		return INSTANCE;
	}

	@Override
	public List consume(
			JdbcValues jdbcValues,
			SharedSessionContractImplementor session,
			JdbcValuesSourceProcessingOptions processingOptions,
			JdbcValuesSourceProcessingStateStandardImpl jdbcValuesSourceProcessingState,
			RowProcessingStateStandardImpl rowProcessingState,
			RowReader rowReader) {
		try {
			session.getPersistenceContext().getLoadContexts().register( jdbcValuesSourceProcessingState );

			boolean uniqueRows = false;
			final Class resultJavaType = rowReader.getResultJavaType();
			if ( resultJavaType != null && ! resultJavaType.isArray() ) {
				final EntityPersister entityDescriptor = session.getFactory().getMetamodel().findEntityDescriptor( resultJavaType );
				if ( entityDescriptor != null ) {
					uniqueRows = true;
				}
			}

			final List results = new ArrayList<>();

			while ( rowProcessingState.next() ) {
				final R row = rowReader.readRow( rowProcessingState, processingOptions );

				boolean add = true;
				if ( uniqueRows ) {
					if ( results.contains( row ) ) {
						add = false;
					}
				}

				if ( add ) {
					results.add( row );
				}

				rowProcessingState.finishRowProcessing();
			}
			return results;
		}
		catch (SQLException e) {
			throw session.getJdbcServices().getSqlExceptionHelper().convert(
					e,
					"Error processing return rows"
			);
		}
		finally {
			rowReader.finishUp( jdbcValuesSourceProcessingState );
			jdbcValuesSourceProcessingState.finishUp();
			jdbcValues.finishUp();
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy