我需要一种解决方法,能够使用类似方法联合使用联接。 criteriaBuilder只支持使用相等方法连接,但不支持类似。对于这些情况,是否有解决方法?
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
switch (criteria.getOperation()) {
case ":":
String[] s = criteria.getKey().split("\\.");
if (s.length == 1) {
if (root.get(criteria.getKey()).getJavaType() == String.class) {
return criteriaBuilder.like(criteriaBuilder.upper(
root.<String>get(criteria.getKey())), "%" + criteria.getValue().toString().toUpperCase() + "%");
} else if (root.get(criteria.getKey()).getJavaType() == Date.class) {
try {
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
return criteriaBuilder.greaterThanOrEqualTo(root.<java.util.Date>get(criteria.getKey()), formatter.parse(criteria.getValue().toString()));
} catch (ParseException e) {
}
} else {
return criteriaBuilder.equal(root.get(criteria.getKey()), criteria.getValue());
}
} else {
//I need a "like" here
return criteriaBuilder.equal(root.join(s[0]).get(s[1]), criteria.getValue());
}
default:
return null;
}
}
我很感激。
答案 0 :(得分:0)
我得到了它的工作。我管理了正确的语法结构,以便与join一起使用。在使用like时,在执行.get put .<String>get
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
switch (criteria.getOperation()) {
case ":":
String[] s = criteria.getKey().split("\\.");
if (s.length == 1) {
if (root.get(criteria.getKey()).getJavaType() == String.class) {
return criteriaBuilder.like(criteriaBuilder.upper(
root.<String>get(criteria.getKey())), "%" + criteria.getValue().toString().toUpperCase() + "%");
} else if (root.get(criteria.getKey()).getJavaType() == Date.class) {
try {
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
return criteriaBuilder.greaterThanOrEqualTo(root.<java.util.Date>get(criteria.getKey()), formatter.parse(criteria.getValue().toString()));
} catch (ParseException e) {
}
} else {
return criteriaBuilder.equal(root.get(criteria.getKey()), criteria.getValue());
}
} else {
//I need a "like" here
return criteriaBuilder.like(criteriaBuilder.upper(root.join(s[0]).join(s[1]).<String>get(s[2])),"%" + criteria.getValue().toString().toUpperCase() + "%");
}
default:
return null;
}
}