@@ -83,33 +83,36 @@ public EntityProjection SetFetchLazyProperties(bool fetchLazyProperties = true)
83
83
84
84
IType [ ] IProjection . GetTypes ( string alias , ICriteria criteria , ICriteriaQuery criteriaQuery )
85
85
{
86
- return new [ ] { criteriaQuery . GetType ( criteria , alias ) } ;
86
+ SetFields ( criteriaQuery ) ;
87
+ return _entityAlias == alias
88
+ ? _types
89
+ : null ;
87
90
}
88
91
89
92
IType [ ] IProjection . GetTypes ( ICriteria criteria , ICriteriaQuery criteriaQuery )
90
93
{
91
- SetFields ( criteria , criteriaQuery ) ;
94
+ SetFields ( criteriaQuery ) ;
92
95
93
96
return _types ;
94
97
}
95
98
96
99
string [ ] IProjection . GetColumnAliases ( int position , ICriteria criteria , ICriteriaQuery criteriaQuery )
97
100
{
98
- SetFields ( criteria , criteriaQuery ) ;
101
+ SetFields ( criteriaQuery ) ;
99
102
100
103
return _identifierColumnAliases ;
101
104
}
102
105
103
106
string [ ] IProjection . GetColumnAliases ( string alias , int position , ICriteria criteria , ICriteriaQuery criteriaQuery )
104
107
{
105
- SetFields ( criteria , criteriaQuery ) ;
108
+ SetFields ( criteriaQuery ) ;
106
109
107
110
return _identifierColumnAliases ;
108
111
}
109
112
110
113
SqlString IProjection . ToSqlString ( ICriteria criteria , int position , ICriteriaQuery criteriaQuery )
111
114
{
112
- SetFields ( criteria , criteriaQuery ) ;
115
+ SetFields ( criteriaQuery ) ;
113
116
114
117
string identifierSelectFragment = Persister . IdentifierSelectFragment ( TableAlias , ColumnAliasSuffix ) ;
115
118
return new SqlString (
@@ -132,20 +135,21 @@ TypedValue[] IProjection.GetTypedValues(ICriteria criteria, ICriteriaQuery crite
132
135
133
136
#endregion IProjection implementation
134
137
135
- private void SetFields ( ICriteria criteria , ICriteriaQuery criteriaQuery )
138
+ private void SetFields ( ICriteriaQuery criteriaQuery )
136
139
{
137
140
//Persister is required, so let's use it as "initialized marker"
138
141
if ( Persister != null )
139
142
return ;
140
143
141
- if ( Lazy == false )
144
+ if ( ! ( criteriaQuery is ISupportEntityProjectionCriteriaQuery entityProjectionQuery ) )
142
145
{
143
- var entityProjectionQuery = criteriaQuery as ISupportEntityProjectionCriteriaQuery ;
144
- if ( entityProjectionQuery == null )
145
- {
146
- throw new HibernateException ( $ "Projecting to entities requires a '{ criteriaQuery . GetType ( ) . FullName } ' type to implement { nameof ( ISupportEntityProjectionCriteriaQuery ) } interface.") ;
147
- }
146
+ throw new HibernateException ( $ "Projecting to entities requires a '{ criteriaQuery . GetType ( ) . FullName } ' type to implement { nameof ( ISupportEntityProjectionCriteriaQuery ) } interface.") ;
147
+ }
148
+
149
+ var criteria = entityProjectionQuery . RootCriteria ;
148
150
151
+ if ( ! Lazy )
152
+ {
149
153
entityProjectionQuery . RegisterEntityProjection ( this ) ;
150
154
}
151
155
@@ -175,7 +179,7 @@ private void SetFields(ICriteria criteria, ICriteriaQuery criteriaQuery)
175
179
176
180
_identifierColumnAliases = Persister . GetIdentifierAliases ( ColumnAliasSuffix ) ;
177
181
178
- _types = new IType [ ] { TypeFactory . ManyToOne ( Persister . EntityName , true ) , } ;
182
+ _types = new IType [ ] { TypeFactory . ManyToOne ( Persister . EntityName , true ) } ;
179
183
}
180
184
}
181
185
}
0 commit comments