7
7
using NHibernate . Persister . Entity ;
8
8
using NHibernate . SqlCommand ;
9
9
using NHibernate . Type ;
10
+ using NHibernate . Util ;
10
11
11
12
namespace NHibernate . Criterion
12
13
{
@@ -60,10 +61,9 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri
60
61
61
62
IOuterJoinLoadable persister = ( IOuterJoinLoadable ) factory . GetEntityPersister ( criteriaImpl . EntityOrClassName ) ;
62
63
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 ) ;
67
67
68
68
parameters = innerQuery . GetQueryParameters ( ) ; // parameters can be inferred only after initialize the walker
69
69
@@ -99,6 +99,7 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri
99
99
return buf . ToSqlString ( ) ;
100
100
}
101
101
102
+
102
103
public override string ToString ( )
103
104
{
104
105
if ( prefixOp )
@@ -117,10 +118,22 @@ public override IProjection[] GetProjections()
117
118
return null ;
118
119
}
119
120
120
- public ICriteria Criteria
121
+ // NH-1146
122
+ public ICriteria Criteria => criteriaImpl ;
123
+
124
+ static ISessionImplementor DeriveRootSession ( ICriteria criteria )
121
125
{
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 ;
124
137
}
125
138
}
126
139
}
0 commit comments