diff --git a/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java b/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java index 8553f128e..cec67c314 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java @@ -191,6 +191,11 @@ public class JpaQueryCreator extends AbstractQueryCreator, @SuppressWarnings({ "rawtypes" }) private Expression getComparablePath(Root root, Part part) { + return getTypedPath(root, part, Comparable.class); + } + + private Expression getTypedPath(Root root, Part part, Class type) { + return toExpressionRecursively(root, part.getProperty()); } @@ -315,7 +320,7 @@ public class JpaQueryCreator extends AbstractQueryCreator, case BETWEEN: ParameterExpression first = provider.next(); ParameterExpression second = provider.next(); - return builder.between(root. get(part.getProperty().toDotPath()), first, second); + return builder.between(getComparablePath(root, part), first, second); case GREATER_THAN: return builder.greaterThan(getComparablePath(root, part), provider.next(Comparable.class)); case LESS_THAN: @@ -330,7 +335,7 @@ public class JpaQueryCreator extends AbstractQueryCreator, return path.in(provider.next(Collection.class)); case LIKE: case NOT_LIKE: - Expression propertyExpression = upperIfIgnoreCase(root. get(part.getProperty().toDotPath())); + Expression propertyExpression = upperIfIgnoreCase(getTypedPath(root, part, String.class)); Expression parameterExpression = upperIfIgnoreCase(provider.next(String.class)); Predicate like = builder.like(propertyExpression, parameterExpression); return part.getType() == Type.LIKE ? like : like.not(); @@ -350,7 +355,7 @@ public class JpaQueryCreator extends AbstractQueryCreator, * @param expression must not be {@literal null}. * @return */ - private Expression upperIfIgnoreCase(Expression expression) { + private Expression upperIfIgnoreCase(Expression expression) { switch (part.shouldIgnoreCase()) { case ALWAYS: @@ -362,7 +367,7 @@ public class JpaQueryCreator extends AbstractQueryCreator, return (Expression) builder.upper((Expression) expression); } } - return expression; + return (Expression) expression; } private boolean canUpperCase(Expression expression) {