无法使用like使用criteriaBuilder加入,仅使用等于

时间:2016-07-24 02:26:27

标签: java spring-data-jpa

我需要一种解决方法,能够使用类似方法联合使用联接。 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;
    }
}

我很感激。

1 个答案:

答案 0 :(得分:0)

我得到了它的工作。我管理了正确的语法结构,以便与join一起使用。在使用like时,在执行.get put .<String>get

之前,需要String作为第一个参数
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;
}
}