Refactor toPredicate метод JPA для поддержки Java 7 и 8 - PullRequest
0 голосов
/ 25 июня 2019

Я сделал некоторое кодирование с использованием метода toPredicate(), теперь я хочу реорганизовать его, чтобы я мог использовать его и в Java 7.

Я разместил ниже пример кода, которыйЯ уже сделал.

EntitySpecification.java

public class EntitySpecification {

    public static Specification<MyEntity> textInAllColumns(String text) {

        if (!text.contains("%")) {
            text = "%"+text+"%";
        }
        final String finalText = text;

        return new Specification<MyEntity>() {
            @Override
            public Predicate toPredicate(Root<MyEntity> root, CriteriaQuery<?> cq, CriteriaBuilder builder) {
                return builder.or(root.getModel().getDeclaredSingularAttributes().stream().filter(a-> {
                    if (a.getJavaType().getSimpleName().equalsIgnoreCase("string")) {
                        return true;
                    }
                    else {
                        return false;
                }}).map(a -> builder.like(root.get(a.getName()), finalText)
                    ).toArray(Predicate[]::new)
                );
            }
        };
    }

 }

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Лямбда-выражения (->) поставлялись с Java 8. Чтобы использовать код в Java 7, необходимо заменить их на анонимные классы.
Если вы используете IDE, например IntelliJ, он может выполнить эту работу длявы.Переместите курсор на -> и нажмите ALT + ENTER.Должно появиться всплывающее окно, и должна быть опция Replace lambda with anonymous class.

.filter(a -> {
    if (a.getJavaType().getSimpleName().equalsIgnoreCase("string")) {
        return true;
    } else {
        return false;
    }
})

до

.filter(new java.util.function.Predicate<SingularAttribute<MyEntity, ?>>() {
  @Override
  public boolean test(SingularAttribute<MyEntity, ?> a) {
      if (a.getJavaType().getSimpleName().equalsIgnoreCase("string")) {
          return true;
      } else {
          return false;
      }
  }
})

Также вам нужно избавиться от всего, что вы используете, от java.util.function пакет.

Вы можете заменить .filter() на цикл for и оператор if внутри него.Для .map() необходимо изменить ранее отфильтрованную коллекцию с помощью цикла for.

new Specification<MyEntity>() {
  @Override
  public Predicate toPredicate(Root<MyEntity> root, CriteriaQuery<?> cq, CriteriaBuilder builder) {
      List<SingularAttribute<MyEntity, ?>> tempAttributes = new ArrayList<>();
      for (SingularAttribute<MyEntity, ?> attribute : root.getModel().getDeclaredSingularAttributes()) {
          if (attribute.getJavaType().getSimpleName().equalsIgnoreCase("string")) {
              tempAttributes.add(attribute);
          }
      }

      final Predicate[] predicates = new Predicate[tempAttributes.size()];

      for (int i = 0; i < tempAttributes.size(); i++) {
          predicates[i] = builder.like(root.<MyEntity>get(tempAttributes.get(i).getName()), finalText);
      }

      return builder.or(predicates);
  }
};

Я сам не пробовал, но это должно сработать или, по крайней мере, дать вам первые шаги.

1 голос
/ 25 июня 2019

Вы должны заменить

- stream
- filter
- map

потому что в Java 7 нет потокового API.

Под заменой я подразумеваю, что вы должны циклически выполнять getDeclaredSingularAttributes () и фильтровать элементы и отображать их.

Также Predicate[]::new необходимо заменить на new Predicate[], потому что теперь есть ссылки на методы.

Как сказал Рашин, это можно сделать с помощью IDE, если вы установите уровень источника на Java 7, он предоставит помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...