18
18
import org .springframework .data .domain .Sort ;
19
19
import org .springframework .data .r2dbc .convert .R2dbcConverter ;
20
20
import org .springframework .data .r2dbc .core .ReactiveDataAccessStrategy ;
21
- import org .springframework .data .relational .core .sql .Condition ;
22
- import org .springframework .data .relational .core .sql .Expression ;
21
+ import org .springframework .data .relational .core .mapping .RelationalPersistentEntity ;
22
+ import org .springframework .data .relational .core .mapping .RelationalPersistentProperty ;
23
+ import org .springframework .data .relational .core .sql .*;
23
24
import org .springframework .data .relational .core .sql .SelectBuilder .SelectFromAndJoin ;
24
- import org .springframework .data .relational .core .sql .StatementBuilder ;
25
- import org .springframework .data .relational .core .sql .Table ;
26
25
import org .springframework .data .relational .core .sql .render .RenderContext ;
27
26
import org .springframework .data .relational .core .sql .render .SqlRenderer ;
28
27
import org .springframework .data .relational .repository .query .RelationalEntityMetadata ;
33
32
34
33
import java .util .Collection ;
35
34
import java .util .Iterator ;
35
+ import java .util .stream .Collectors ;
36
36
37
37
/**
38
38
* Implementation of {@link AbstractQueryCreator} that creates {@link BindableQuery} from a {@link PartTree}.
@@ -108,6 +108,10 @@ protected String complete(Condition condition, Sort sort) {
108
108
selectBuilder .where (condition );
109
109
}
110
110
111
+ if (sort .isSorted ()) {
112
+ selectBuilder .orderBy (getOrderBySegments (sort , fromTable ));
113
+ }
114
+
111
115
RenderContext renderContext = dataAccessStrategy .getStatementMapper ().getRenderContext ();
112
116
SqlRenderer sqlRenderer = renderContext == null ? SqlRenderer .create () : SqlRenderer .create (renderContext );
113
117
return sqlRenderer .render (selectBuilder .build ());
@@ -119,4 +123,22 @@ private Collection<? extends Expression> getSelectionExpressions(Table fromTable
119
123
}
120
124
return fromTable .columns (dataAccessStrategy .getAllColumns (entityMetadata .getJavaType ()));
121
125
}
126
+
127
+ private Collection <? extends OrderByField > getOrderBySegments (Sort sort , Table fromTable ) {
128
+ RelationalPersistentEntity <?> tableEntity = entityMetadata .getTableEntity ();
129
+ return sort .get ().map (order -> {
130
+ RelationalPersistentProperty property = tableEntity .getRequiredPersistentProperty (order .getProperty ());
131
+ Column column = fromTable .column (property .getColumnName ());
132
+ // TODO: org.springframework.data.relational.core.sql.render.OrderByClauseVisitor from
133
+ // spring-data-relational does not prepend column name with table name. It makes sense to render
134
+ // column names uniformly.
135
+ OrderByField orderByField = OrderByField .from (column );
136
+ if (order .isAscending ()) {
137
+ orderByField = orderByField .asc ();
138
+ } else {
139
+ orderByField = orderByField .desc ();
140
+ }
141
+ return orderByField ;
142
+ }).collect (Collectors .toList ());
143
+ }
122
144
}
0 commit comments