'Spring boot Jpa search data with multiple fields and paginate results

I am trying to search data on the basis of 5 input fields in spring boot jpa repository also in result will get multiple columns data in pagination. So suppose out of 5 fields only 4 input fields is given then it will search on the basis of 4 input data with and conditions. Can any one please provide complete code with explaination.



Solution 1:[1]

I used Specification inside my projects so that I can create dynamic queries depending if parameter exists.

First, you need to create a util class where you keep your Specifications so that you can call them statically.

public class YourSpecifications {
    private YourSpecifications() {
        throw new IllegalStateException("Utility Class");
    }

    public static Specification<YourEntity> ifExistsEquals(ParameterType parameterNullable) {
        return (root, query, criteriaBuilder) -> Optional.ofNullable(parameterNullable)
                .map(parameter -> criteriaBuilder.equal(root.get("yourFieldForParameter"), parameter))
                .orElse(criteriaBuilder.conjunction()); // Thanks to this code block if your parameter does not exist it will not include inside query

    }
}

To execute our queries with specifications, we need to add another implementation which is JpaSpecificationExecutor<T> inside our Repository interface.

public interface YourRepository extends JpaRepository<YourEntity, Long>, JpaSpecificationExecutor<YourEntity> {// I defined my primary key as Long
}

Now we can create a filter inside our service layer

public class YourService {
    private static final String ORDER_BY = "id"; //your preference 
    private final YourRepository yourRepository;

    public Page<YourEntity> findAll(YourParameter yourParamNullable, Integer page, Integer size) {
        Specification<BasketEntity> filter =
                Specification.where(YourSpecifications.ifExistsEquals(yourParamNullable))// more queries with .and(), .or(). etc. 

        return yourRepository.findAll(filter, PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, ORDER_BY)));//Best to convert your own dto this is just an example
    }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1