Do not prefix unsafe orer by expressions with table prefix.

Such expressions now get passed on unchanged.

This also deprecates org.springframework.data.r2dbc.query.QueryMapper.getMappedObject(Sort, RelationalPersistentEntity<?>).
It was only used in tests and translates an Order into another Order, which sounds wrong.

Closes #1512
Original pull request: #1513
This commit is contained in:
Jens Schauder
2023-05-12 16:14:08 +02:00
committed by Mark Paluch
parent 9acf426ff7
commit e0a0bb2b5d
4 changed files with 31 additions and 3 deletions

View File

@@ -93,6 +93,8 @@ public class QueryMapper {
for (Sort.Order order : sort) {
SqlSort.validate(order);
OrderByField simpleOrderByField = createSimpleOrderByField(table, entity, order);
OrderByField orderBy = simpleOrderByField
.withNullHandling(order.getNullHandling());
@@ -105,7 +107,9 @@ public class QueryMapper {
private OrderByField createSimpleOrderByField(Table table, RelationalPersistentEntity<?> entity, Sort.Order order) {
SqlSort.validate(order);
if (order instanceof SqlSort.SqlOrder sqlOrder && sqlOrder.isUnsafe()) {
return OrderByField.from(Expressions.just(sqlOrder.getProperty()));
}
Field field = createPropertyField(entity, SqlIdentifier.unquoted(order.getProperty()), this.mappingContext);
return OrderByField.from(table.column(field.getMappedColumnName()));

View File

@@ -430,7 +430,7 @@ public class QueryMapperUnitTests {
assertThat(fields) //
.extracting(Objects::toString) //
.containsExactly("tbl." + unsafeExpression + " ASC");
.containsExactly( unsafeExpression + " ASC");
}
private Condition map(Criteria criteria) {

View File

@@ -22,6 +22,7 @@ import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import org.jetbrains.annotations.NotNull;
import org.springframework.data.domain.Sort;
import org.springframework.data.mapping.MappingException;
import org.springframework.data.mapping.PersistentPropertyPath;
@@ -50,6 +51,8 @@ import org.springframework.r2dbc.core.binding.MutableBindings;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import static org.springframework.data.relational.core.sql.Expressions.*;
/**
* Maps {@link CriteriaDefinition} and {@link Sort} objects considering mapping metadata and dialect-specific
* conversion.
@@ -102,7 +105,9 @@ public class QueryMapper {
* @param sort must not be {@literal null}.
* @param entity related {@link RelationalPersistentEntity}, can be {@literal null}.
* @return
* @deprecated without replacement.
*/
@Deprecated(since = "3.2", forRemoval = true)
public Sort getMappedObject(Sort sort, @Nullable RelationalPersistentEntity<?> entity) {
if (entity == null) {
@@ -137,6 +142,8 @@ public class QueryMapper {
for (Sort.Order order : sort) {
SqlSort.validate(order);
OrderByField simpleOrderByField = createSimpleOrderByField(table, entity, order);
OrderByField orderBy = simpleOrderByField
.withNullHandling(order.getNullHandling());
@@ -147,9 +154,12 @@ public class QueryMapper {
}
private OrderByField createSimpleOrderByField(Table table, RelationalPersistentEntity<?> entity, Sort.Order order) {
SqlSort.validate(order);
if (order instanceof SqlSort.SqlOrder sqlOrder && sqlOrder.isUnsafe()) {
return OrderByField.from(Expressions.just(sqlOrder.getProperty()));
}
Field field = createPropertyField(entity, SqlIdentifier.unquoted(order.getProperty()), this.mappingContext);
return OrderByField.from(table.column(field.getMappedColumnName()));

View File

@@ -39,6 +39,7 @@ import org.springframework.data.relational.core.sql.Expression;
import org.springframework.data.relational.core.sql.Functions;
import org.springframework.data.relational.core.sql.OrderByField;
import org.springframework.data.relational.core.sql.Table;
import org.springframework.data.relational.domain.SqlSort;
import org.springframework.r2dbc.core.Parameter;
import org.springframework.r2dbc.core.binding.BindMarkersFactory;
import org.springframework.r2dbc.core.binding.BindTarget;
@@ -440,6 +441,19 @@ class QueryMapperUnitTests {
.containsExactly("tbl.unknownField DESC");
}
@Test // GH-1512
public void shouldTablePrefixUnsafeOrderExpression() {
Sort sort = Sort.by(SqlSort.SqlOrder.desc("unknownField").withUnsafe());
List<OrderByField> fields = mapper.getMappedSort(Table.create("tbl"), sort,
mapper.getMappingContext().getRequiredPersistentEntity(Person.class));
assertThat(fields) //
.extracting(Objects::toString) //
.containsExactly("unknownField DESC");
}
@Test // GH-1507
public void shouldMapSortWithAllowedSpecialCharacters() {