}
}
private Loader getLoader(Session session, SearchFactoryImplementor searchFactoryImplementor) {
if ( indexProjection != null ) {
ProjectionLoader loader = new ProjectionLoader();
loader.init( session, searchFactoryImplementor, resultTransformer, indexProjection );
loader.setEntityTypes( targetedEntities );
return loader;
}
if ( criteria != null ) {
if ( targetedEntities.size() > 1 ) {
throw new SearchException( "Cannot mix criteria and multiple entity types" );
}
if ( criteria instanceof CriteriaImpl ) {
String targetEntity = ( ( CriteriaImpl ) criteria ).getEntityOrClassName();
if ( targetedEntities.size() == 1 && !targetedEntities.iterator()
.next()
.getName()
.equals( targetEntity ) ) {
throw new SearchException( "Criteria query entity should match query entity" );
}
else {
try {
Class entityType = ReflectHelper.classForName( targetEntity );
targetedEntities = new HashSet<Class<?>>( 1 );
targetedEntities.add( entityType );
}
catch ( ClassNotFoundException e ) {
throw new SearchException( "Unable to load entity class from criteria: " + targetEntity, e );
}
}
}
QueryLoader loader = new QueryLoader();
loader.init( session, searchFactoryImplementor );
loader.setEntityType( targetedEntities.iterator().next() );
loader.setCriteria( criteria );
return loader;
}
else if ( targetedEntities.size() == 1 ) {
final QueryLoader loader = new QueryLoader();
loader.init( session, searchFactoryImplementor );
loader.setEntityType( targetedEntities.iterator().next() );
return loader;
}
else {
final MultiClassesQueryLoader loader = new MultiClassesQueryLoader();
loader.init( session, searchFactoryImplementor );
loader.setEntityTypes( targetedEntities );
return loader;
}
}