1
//$Id: AbstractEntityJoinWalker.java 11081 2007-01-23 16:31:13Z steve.ebersole@jboss.com $
2
package org.hibernate.loader;
4
import java.util.ArrayList;
8
import org.hibernate.FetchMode;
9
import org.hibernate.LockMode;
10
import org.hibernate.MappingException;
11
import org.hibernate.engine.CascadeStyle;
12
import org.hibernate.engine.SessionFactoryImplementor;
13
import org.hibernate.persister.entity.Loadable;
14
import org.hibernate.persister.entity.OuterJoinLoadable;
15
import org.hibernate.sql.JoinFragment;
16
import org.hibernate.sql.Select;
17
import org.hibernate.type.AssociationType;
18
import org.hibernate.util.CollectionHelper;
21
* Abstract walker for walkers which begin at an entity (criteria
22
* queries and entity loaders).
26
public abstract class AbstractEntityJoinWalker extends JoinWalker {
28
private final OuterJoinLoadable persister;
31
public AbstractEntityJoinWalker(OuterJoinLoadable persister, SessionFactoryImplementor factory, Map enabledFilters) {
32
super( factory, enabledFilters );
33
this.persister = persister;
34
alias = generateRootAlias( persister.getEntityName() );
37
protected final void initAll(
38
final String whereString,
39
final String orderByString,
40
final LockMode lockMode)
41
throws MappingException {
43
walkEntityTree( persister, getAlias() );
45
List allAssociations = new ArrayList();
46
allAssociations.addAll(associations);
47
allAssociations.add( new OuterJoinableAssociation(
48
persister.getEntityType(),
52
JoinFragment.LEFT_OUTER_JOIN,
54
CollectionHelper.EMPTY_MAP
57
initPersisters(allAssociations, lockMode);
58
initStatementString( whereString, orderByString, lockMode);
61
protected final void initProjection(
62
final String projectionString,
63
final String whereString,
64
final String orderByString,
65
final String groupByString,
66
final LockMode lockMode)
67
throws MappingException {
68
walkEntityTree( persister, getAlias() );
69
persisters = new Loadable[0];
70
initStatementString(projectionString, whereString, orderByString, groupByString, lockMode);
73
private void initStatementString(
74
final String condition,
76
final LockMode lockMode)
77
throws MappingException {
78
initStatementString(null, condition, orderBy, "", lockMode);
81
private void initStatementString(
82
final String projection,
83
final String condition,
86
final LockMode lockMode) throws MappingException {
88
final int joins = countEntityPersisters( associations );
89
suffixes = BasicLoader.generateSuffixes( joins + 1 );
91
JoinFragment ojf = mergeOuterJoins( associations );
93
Select select = new Select( getDialect() )
94
.setLockMode( lockMode )
97
persister.selectFragment( alias, suffixes[joins] ) + selectString( associations ) :
101
getDialect().appendLockHint( lockMode, persister.fromTableFragment( alias ) ) +
102
persister.fromJoinFragment( alias, true, true )
104
.setWhereClause( condition )
106
ojf.toFromFragmentString(),
107
ojf.toWhereFragmentString() + getWhereFragment()
109
.setOrderByClause( orderBy( associations, orderBy ) )
110
.setGroupByClause( groupBy );
112
if ( getFactory().getSettings().isCommentsEnabled() ) {
113
select.setComment( getComment() );
115
sql = select.toStatementString();
118
protected String getWhereFragment() throws MappingException {
119
// here we do not bother with the discriminator.
120
return persister.whereJoinFragment(alias, true, true);
124
* The superclass deliberately excludes collections
126
protected boolean isJoinedFetchEnabled(AssociationType type, FetchMode config, CascadeStyle cascadeStyle) {
127
return isJoinedFetchEnabledInMapping(config, type);
130
public abstract String getComment();
132
protected final Loadable getPersister() {
136
protected final String getAlias() {
140
public String toString() {
141
return getClass().getName() + '(' + getPersister().getEntityName() + ')';