12
12
import org .hibernate .query .criteria .JpaCteCriteriaAttribute ;
13
13
import org .hibernate .query .criteria .JpaCteCriteriaType ;
14
14
import org .hibernate .query .sqm .SqmBindableType ;
15
+ import org .hibernate .query .sqm .tree .select .SqmSelectClause ;
15
16
import org .hibernate .query .sqm .tuple .internal .AnonymousTupleSimpleSqmPathSource ;
16
17
import org .hibernate .query .sqm .tuple .internal .AnonymousTupleType ;
17
18
import org .hibernate .query .sqm .tuple .internal .CteTupleTableGroupProducer ;
@@ -34,13 +35,14 @@ public class SqmCteTable<T> extends AnonymousTupleType<T> implements JpaCteCrite
34
35
private SqmCteTable (
35
36
String name ,
36
37
SqmCteStatement <T > cteStatement ,
37
- SqmSelectableNode <?>[] sqmSelectableNodes ) {
38
- super ( sqmSelectableNodes );
38
+ SqmSelectableNode <?>[] sqmSelectableNodes ,
39
+ List <String > aliases ) {
40
+ super ( sqmSelectableNodes , aliases );
39
41
this .name = name ;
40
42
this .cteStatement = cteStatement ;
41
43
final List <SqmCteTableColumn > columns = new ArrayList <>( componentCount () );
42
44
for ( int i = 0 ; i < componentCount (); i ++ ) {
43
- columns .add ( new SqmCteTableColumn ( this , getComponentName (i ), get (i ) ) );
45
+ columns .add ( new SqmCteTableColumn ( this , aliases . get (i ), get (i ) ) );
44
46
}
45
47
this .columns = columns ;
46
48
}
@@ -49,12 +51,20 @@ public static <X> SqmCteTable<X> createStatementTable(
49
51
String name ,
50
52
SqmCteStatement <X > cteStatement ,
51
53
SqmSelectQuery <X > selectStatement ) {
52
- final SqmSelectableNode <?>[] sqmSelectableNodes = selectStatement .getQueryPart ()
54
+ final SqmSelectClause selectClause = selectStatement .getQueryPart ()
53
55
.getFirstQuerySpec ()
54
- .getSelectClause ()
56
+ .getSelectClause ();
57
+ final SqmSelectableNode <?>[] sqmSelectableNodes = selectClause
55
58
.getSelectionItems ()
56
59
.toArray ( SqmSelectableNode []::new );
57
- return new SqmCteTable <>( name , cteStatement , sqmSelectableNodes );
60
+ final var aliases = new ArrayList <String >();
61
+ for (final var selection : selectClause .getSelections ()) {
62
+ final var alias = selection .getAlias ();
63
+ selection .getSelectableNode ().visitSubSelectableNodes ( node ->
64
+ aliases .add ( alias == null ? node .getAlias () : alias )
65
+ );
66
+ }
67
+ return new SqmCteTable <>( name , cteStatement , sqmSelectableNodes , aliases );
58
68
}
59
69
60
70
@ Override
0 commit comments