diff --git a/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java b/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java index 95bc206..69beac3 100644 --- a/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java +++ b/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java @@ -20,12 +20,13 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.regex.Pattern; import org.springframework.data.domain.Sort; +import org.springframework.data.mapping.MappingException; import org.springframework.data.mapping.PersistentPropertyPath; import org.springframework.data.mapping.PropertyPath; import org.springframework.data.mapping.PropertyReferenceException; -import org.springframework.data.mapping.context.InvalidPersistentPropertyPath; import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.r2dbc.convert.R2dbcConverter; import org.springframework.data.r2dbc.dialect.BindMarker; @@ -626,7 +627,7 @@ public class QueryMapper { private final RelationalPersistentEntity entity; private final MappingContext, RelationalPersistentProperty> mappingContext; - private final RelationalPersistentProperty property; + private final @Nullable RelationalPersistentProperty property; private final @Nullable PersistentPropertyPath path; /** @@ -675,7 +676,7 @@ public class QueryMapper { /** * Returns the {@link PersistentPropertyPath} for the given {@code pathExpression}. * - * @param pathExpression + * @param pathExpression the path expression to use. * @return */ @Nullable @@ -683,18 +684,27 @@ public class QueryMapper { try { - PropertyPath path = PropertyPath.from(pathExpression, this.entity.getTypeInformation()); + PropertyPath path = forName(pathExpression); if (isPathToJavaLangClassProperty(path)) { return null; } return this.mappingContext.getPersistentPropertyPath(path); - } catch (PropertyReferenceException | InvalidPersistentPropertyPath e) { + } catch (MappingException | PropertyReferenceException e) { return null; } } + private PropertyPath forName(String path) { + + if (entity.getPersistentProperty(path) != null) { + return PropertyPath.from(Pattern.quote(path), entity.getTypeInformation()); + } + + return PropertyPath.from(path, entity.getTypeInformation()); + } + private boolean isPathToJavaLangClassProperty(PropertyPath path) { return path.getType().equals(Class.class) && path.getLeafProperty().getOwningType().getType().equals(Class.class); } diff --git a/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java b/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java index 436f436..9a28908 100644 --- a/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java +++ b/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java @@ -369,6 +369,25 @@ public class QueryMapperUnitTests { assertThat(mapped.getOrderFor("alternative")).isNull(); } + @Test // gh-369 + public void mapSortForPropertyPathInPrimitiveShouldFallBackToColumnName() { + + Sort sort = Sort.by(desc("alternative_name")); + + Sort mapped = mapper.getMappedObject(sort, context.getRequiredPersistentEntity(Person.class)); + assertThat(mapped.getOrderFor("alternative_name")).isEqualTo(desc("alternative_name")); + } + + @Test // gh-369 + public void mapQueryForPropertyPathInPrimitiveShouldFallBackToColumnName() { + + Criteria criteria = Criteria.where("alternative_name").is("a"); + + BoundCondition bindings = map(criteria); + + assertThat(bindings.getCondition().toString()).isEqualTo("person.alternative_name = ?[$1]"); + } + private BoundCondition map(Criteria criteria) { BindMarkersFactory markers = BindMarkersFactory.indexed("$", 1);