0

I need to create a query by deciding on runtime. Basically I have few parameters and one of them will specify If I should use And or Or to combine criterias. By using Spring JPA Repository how can I do it? It is easy to do it for parameters as :

@Query(value = "SELECT u FROM User u WHERE u.name IN :names")
List<User> findUserByNameList(@Param("names") Collection<String> names);

But if I want to add one more criteria lets say size, and I need to decide which one of (AND,OR) to use to combine criteria, how can I do it?

Example:

  SELECT u FROM User u WHERE u.name IN :names OR/AND size = 10; 
user1474111
  • 1,356
  • 3
  • 23
  • 47
  • Possible duplicate of [Dynamic spring data jpa repository query with arbitrary AND clauses](https://stackoverflow.com/questions/28874135/dynamic-spring-data-jpa-repository-query-with-arbitrary-and-clauses) – Jens Schauder Oct 23 '19 at 05:33

1 Answers1

0
public List<User> getUsers(List<String> names, Integer size, boolean useOrPredicate) {

        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<User> criteriaQuery = criteriaBuilder.createQuery(User.class);
        Root<User> user = criteriaQuery.from(User.class);

        Predicate predicate1 = user.get("name").in(names);
        Predicate predicate2 = criteriaBuilder.equal(user.get("size"), size);

        Predicate predicate;

        if(useOrPredicate) 
           predicate = criteriaBuilder.or(predicate1, predicate2);
        else
           predicate = criteriaBuilder.and(predicate1, predicate2);

        criteriaQuery.where(predicate);

        return entityManager.createQuery(criteriaQuery).getResultList();
}
Oleksii Valuiskyi
  • 2,691
  • 1
  • 8
  • 22