Skip to content

Commit 7095113

Browse files
committed
spring-projects#282 - Support ordering
1 parent 7c135fe commit 7095113

File tree

2 files changed

+41
-4
lines changed

2 files changed

+41
-4
lines changed

Diff for: src/main/java/org/springframework/data/r2dbc/repository/query/R2dbcQueryCreator.java

+26-4
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,10 @@
1818
import org.springframework.data.domain.Sort;
1919
import org.springframework.data.r2dbc.convert.R2dbcConverter;
2020
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.*;
2324
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;
2625
import org.springframework.data.relational.core.sql.render.RenderContext;
2726
import org.springframework.data.relational.core.sql.render.SqlRenderer;
2827
import org.springframework.data.relational.repository.query.RelationalEntityMetadata;
@@ -33,6 +32,7 @@
3332

3433
import java.util.Collection;
3534
import java.util.Iterator;
35+
import java.util.stream.Collectors;
3636

3737
/**
3838
* Implementation of {@link AbstractQueryCreator} that creates {@link BindableQuery} from a {@link PartTree}.
@@ -108,6 +108,10 @@ protected String complete(Condition condition, Sort sort) {
108108
selectBuilder.where(condition);
109109
}
110110

111+
if (sort.isSorted()) {
112+
selectBuilder.orderBy(getOrderBySegments(sort, fromTable));
113+
}
114+
111115
RenderContext renderContext = dataAccessStrategy.getStatementMapper().getRenderContext();
112116
SqlRenderer sqlRenderer = renderContext == null ? SqlRenderer.create() : SqlRenderer.create(renderContext);
113117
return sqlRenderer.render(selectBuilder.build());
@@ -119,4 +123,22 @@ private Collection<? extends Expression> getSelectionExpressions(Table fromTable
119123
}
120124
return fromTable.columns(dataAccessStrategy.getAllColumns(entityMetadata.getJavaType()));
121125
}
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+
}
122144
}

Diff for: src/test/java/org/springframework/data/r2dbc/repository/query/PartTreeR2dbcQueryIntegrationTests.java

+15
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,19 @@ public void wrapsLikeOperatorParameterWithPercentSymbolsForContainingQuery() thr
331331
verify(bindSpecMock, times(1)).bind(0, "%hn%");
332332
}
333333

334+
@Test
335+
public void createsQueryToFindAllEntitiesByIntegerAttributeWithDescendingOrderingByStringAttribute()
336+
throws Exception {
337+
R2dbcQueryMethod queryMethod = getQueryMethod("findAllByAgeOrderByLastNameDesc", Integer.class);
338+
PartTreeR2dbcQuery r2dbcQuery = new PartTreeR2dbcQuery(queryMethod, databaseClient, r2dbcConverter,
339+
dataAccessStrategy);
340+
RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[] {"oh"});
341+
BindableQuery bindableQuery = r2dbcQuery.createQuery(accessor);
342+
String expectedSql = "SELECT " + ALL_FIELDS + " FROM " + TABLE
343+
+ " WHERE " + TABLE + ".age = ? ORDER BY last_name DESC";
344+
assertThat(bindableQuery.get()).isEqualTo(expectedSql);
345+
}
346+
334347
private R2dbcQueryMethod getQueryMethod(String methodName, Class<?>... parameterTypes) throws Exception {
335348
Method method = UserRepository.class.getMethod(methodName, parameterTypes);
336349
return new R2dbcQueryMethod(method, new DefaultRepositoryMetadata(UserRepository.class),
@@ -377,6 +390,8 @@ private interface UserRepository extends Repository<User, Long> {
377390
Flux<User> findAllByFirstNameEndingWith(String ending);
378391

379392
Flux<User> findAllByFirstNameContaining(String containing);
393+
394+
Flux<User> findAllByAgeOrderByLastNameDesc(Integer age);
380395
}
381396

382397
@Table("users")

0 commit comments

Comments
 (0)