diff --git a/hibernate-core/src/main/java/org/hibernate/query/range/Interval.java b/hibernate-core/src/main/java/org/hibernate/query/range/Interval.java index a0cfff20a917..4feaffa39fac 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/range/Interval.java +++ b/hibernate-core/src/main/java/org/hibernate/query/range/Interval.java @@ -19,7 +19,7 @@ record Interval>(LowerBound lowerBound, UpperBound public Predicate toPredicate(Path path, CriteriaBuilder builder) { return lowerBound.open() || upperBound.open() ? builder.and( lowerBound.toPredicate( path, builder ), upperBound.toPredicate( path, builder ) ) - : builder.between( path, builder.literal( lowerBound.bound() ), builder.literal( upperBound.bound() ) ); + : builder.between( path, lowerBound.bound(), upperBound.bound() ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/range/Pattern.java b/hibernate-core/src/main/java/org/hibernate/query/range/Pattern.java index 0da1c45e9f13..53e12a159e24 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/range/Pattern.java +++ b/hibernate-core/src/main/java/org/hibernate/query/range/Pattern.java @@ -16,6 +16,12 @@ * @author Gavin King */ record Pattern(String pattern, boolean caseSensitive) implements Range { + + // default escape and wildcard characters + private static final char ESCAPE = '\\'; + private static final char WILDCARD_CHAR = '_'; + private static final char WILDCARD_STRING = '%'; + Pattern(String pattern, boolean caseSensitive, char charWildcard, char stringWildcard) { this( translate( pattern, charWildcard, stringWildcard ), caseSensitive ); } @@ -25,10 +31,8 @@ public Predicate toPredicate(Path path, CriteriaBuilder builde @SuppressWarnings("unchecked") final Path stringPath = (Path) path; // safe, because String is final return caseSensitive - ? builder.like( stringPath, builder.literal( pattern ), '\\' ) - : builder.like( builder.lower( stringPath ), - builder.literal( pattern.toLowerCase( Locale.ROOT ) ), - '\\' ); + ? builder.like( stringPath, pattern, ESCAPE ) + : builder.like( builder.lower( stringPath ), pattern.toLowerCase( Locale.ROOT ), ESCAPE ); } @Override @@ -41,14 +45,14 @@ private static String translate(String pattern, char charWildcard, char stringWi for ( int i = 0; i < pattern.length(); i++ ) { final char ch = pattern.charAt( i ); if ( ch == charWildcard ) { - result.append( '_' ); + result.append( WILDCARD_CHAR ); } else if ( ch == stringWildcard ) { - result.append( '%' ); + result.append( WILDCARD_STRING ); } else { - if ( ch == '%' || ch == '_' || ch == '\\' ) { - result.append( '\\' ); + if ( ch == WILDCARD_STRING || ch == WILDCARD_CHAR || ch == ESCAPE ) { + result.append( ESCAPE ); } result.append( ch ); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/range/ValueList.java b/hibernate-core/src/main/java/org/hibernate/query/range/ValueList.java index 56d32caa4137..92c605f50b84 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/range/ValueList.java +++ b/hibernate-core/src/main/java/org/hibernate/query/range/ValueList.java @@ -27,7 +27,7 @@ record ValueList(List values) implements Range { @Override public Predicate toPredicate(Path path, CriteriaBuilder builder) { - return path.in( values.stream().map( builder::literal ).toList() ); + return path.in( values ); } @Override