public static Predicate[] oAuthGrantsListPredicates( CriteriaBuilder cb, Root<OAuthGrant> from, User user, Optional<Date> startOpt, Optional<Date> endOpt, Optional<String> oAuthIdOpt, Optional<Integer> typeOpt, Optional<String> scopeOpt, Optional<String> redirectUri, Optional<Integer> accessType) { List<Predicate> predicates = new LinkedList<>(); if (!user.isAdmin()) { predicates.add(from.join("user").in(user)); } startOpt.ifPresent(start -> predicates.add(cb.greaterThan(from.get("timestamp"), start))); endOpt.ifPresent(end -> predicates.add(cb.lessThan(from.get("timestamp"), end))); oAuthIdOpt.ifPresent(id -> predicates.add(cb.equal(from.join("client").get("oauthId"), id))); typeOpt.ifPresent(type -> predicates.add(cb.equal(from.get("type"), type))); scopeOpt.ifPresent(scope -> predicates.add(cb.equal(from.get("scope"), scope))); redirectUri.ifPresent(uri -> predicates.add(cb.equal(from.get("redirectUri"), uri))); accessType.ifPresent(at -> predicates.add(cb.equal(from.get("accessType"), at))); return predicates.toArray(new Predicate[predicates.size()]); }