77using NHibernate . Persister . Entity ;
88using NHibernate . SqlCommand ;
99using NHibernate . Type ;
10+ using NHibernate . Util ;
1011
1112namespace NHibernate . Criterion
1213{
@@ -60,10 +61,9 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri
6061
6162 IOuterJoinLoadable persister = ( IOuterJoinLoadable ) factory . GetEntityPersister ( criteriaImpl . EntityOrClassName ) ;
6263
63- //patch to generate joins on subqueries
64- //stolen from CriteriaLoader
65- CriteriaJoinWalker walker =
66- new CriteriaJoinWalker ( persister , innerQuery , factory , criteriaImpl , criteriaImpl . EntityOrClassName , enabledFilters ) ;
64+ criteriaImpl . Session = DeriveRootSession ( criteria ) ;
65+
66+ var walker = new CriteriaJoinWalker ( persister , innerQuery , factory , criteriaImpl , criteriaImpl . EntityOrClassName , criteriaImpl . Session . EnabledFilters ) ;
6767
6868 parameters = innerQuery . GetQueryParameters ( ) ; // parameters can be inferred only after initialize the walker
6969
@@ -99,6 +99,7 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri
9999 return buf . ToSqlString ( ) ;
100100 }
101101
102+
102103 public override string ToString ( )
103104 {
104105 if ( prefixOp )
@@ -117,10 +118,22 @@ public override IProjection[] GetProjections()
117118 return null ;
118119 }
119120
120- public ICriteria Criteria
121+ // NH-1146
122+ public ICriteria Criteria => criteriaImpl ;
123+
124+ static ISessionImplementor DeriveRootSession ( ICriteria criteria )
121125 {
122- // NH-1146
123- get { return criteriaImpl ; }
126+ while ( criteria is CriteriaImpl . Subcriteria subcriteria )
127+ {
128+ criteria = subcriteria . Parent ;
129+ }
130+ if ( criteria is CriteriaImpl criteriaImpl )
131+ {
132+ return criteriaImpl . Session ;
133+ }
134+ // could happen for custom Criteria impls. Not likely, but...
135+ // for long term solution, see HHH-3514
136+ return null ;
124137 }
125138 }
126139}
0 commit comments