1616 * @author Gavin King
1717 */
1818record Pattern (String pattern , boolean caseSensitive ) implements Range <String > {
19+
20+ // default escape and wildcard characters
21+ private static final char ESCAPE = '\\' ;
22+ private static final char WILDCARD_CHAR = '_' ;
23+ private static final char WILDCARD_STRING = '%' ;
24+
1925 Pattern (String pattern , boolean caseSensitive , char charWildcard , char stringWildcard ) {
2026 this ( translate ( pattern , charWildcard , stringWildcard ), caseSensitive );
2127 }
@@ -25,10 +31,8 @@ public Predicate toPredicate(Path<? extends String> path, CriteriaBuilder builde
2531 @ SuppressWarnings ("unchecked" )
2632 final Path <String > stringPath = (Path <String >) path ; // safe, because String is final
2733 return caseSensitive
28- ? builder .like ( stringPath , builder .literal ( pattern ), '\\' )
29- : builder .like ( builder .lower ( stringPath ),
30- builder .literal ( pattern .toLowerCase ( Locale .ROOT ) ),
31- '\\' );
34+ ? builder .like ( stringPath , pattern , ESCAPE )
35+ : builder .like ( builder .lower ( stringPath ), pattern .toLowerCase ( Locale .ROOT ), ESCAPE );
3236 }
3337
3438 @ Override
@@ -41,14 +45,14 @@ private static String translate(String pattern, char charWildcard, char stringWi
4145 for ( int i = 0 ; i < pattern .length (); i ++ ) {
4246 final char ch = pattern .charAt ( i );
4347 if ( ch == charWildcard ) {
44- result .append ( '_' );
48+ result .append ( WILDCARD_CHAR );
4549 }
4650 else if ( ch == stringWildcard ) {
47- result .append ( '%' );
51+ result .append ( WILDCARD_STRING );
4852 }
4953 else {
50- if ( ch == '%' || ch == '_' || ch == '\\' ) {
51- result .append ( '\\' );
54+ if ( ch == WILDCARD_STRING || ch == WILDCARD_CHAR || ch == ESCAPE ) {
55+ result .append ( ESCAPE );
5256 }
5357 result .append ( ch );
5458 }
0 commit comments