Проблема заключалась в том, как я объяснил в вопросе, что у меня есть таблица X
. В этой таблице у меня есть столбец 1
. В столбце 1
у меня есть два значения: "abcd"
и "ab cd"
. Я хочу получить оба значения, передав "abcd"
в качестве параметров поиска в criteriaBuilder
.
У меня был следующий код для начального и конечного пробелов, но он не работал для "ab cd"
с белым пробел не на краю строки.
В основном я хотел сравнить строки между значением столбца ввода и базы данных (заменено пробелом):
criteriaBuilder.equal(criteriaBuilder.trim(criteriaBuilder.upper(Column 1);
Я заменил это на
Predicate postCodePredicate = criteriaBuilder.like(criteriaBuilder.upper(criteriaBuilder.function("REPLACE", String.class, criteriaBuilder.upper(addJoin.get("Code")) , criteriaBuilder.literal(" ") , criteriaBuilder.literal(""))) , "%" + pCode(filter.getCode()).toUpperCase().replace(" ", "") + "%" );
, как предложено в критериях jpa, сравнивает две строки без учета пробелов
В основном используется функция criteriaBuilder
с "REPLACE"
criteriaBuilder.function("REPLACE",
String.class,
criteriaBuilder.upper(addJoin.get("Code")) ,
//Expression above
criteriaBuilder.literal(" ") ,
criteriaBuilder.literal(""))) ,
"%" + pCode(filter.getCode()).toUpperCase().replace("
", "") + "%" ) //pCode(filter.getCode() is //your input search param
Я вызываю функцию со следующими параметрами
public <T> Expression<T> function(String name, Class<T> returnType, Expression... arguments) {
return new ParameterizedFunctionExpression(this, returnType, name, arguments);
}
Вы также можете использовать criteriaBuilder.equal
, как показано ниже, если вы не хотите criteriaBuilder.like
, просто удалите "%"
Predicate postCodePredicate = criteriaBuilder.like(criteriaBuilder.upper(criteriaBuilder.function("REPLACE", String.class, criteriaBuilder.upper(addJoin.get("Code")) , criteriaBuilder.literal(" ") , criteriaBuilder.literal(""))) , pCode(filter.getCode()).toUpperCase().replace(" ", "") );