问题是,正如问题中所解释的,我有一张桌子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 criteria compare two strings in without considering spaces建议的那样
基本上它使用函数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.like,也可以使用criteriaBuilder.equal,如下所示,只需删除"%"
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(" ", "") );