I have an application that uses Spring Boot Data jpa . So far i am using a repository like this
public interface StudentRepository extends CrudRepos         
        
JPA 2 introduces a criteria API that can be used to build queries programmatically.
You can extend a new interface from JpaSpecificationExecutor
public interface CustomerRepository extends 
  CrudRepository, 
  JpaSpecificationExecutor {
  default List findCustomers() {
    return findAll(CustomerSpecs.findCustomers());
  }
   
Then create a customer specs
public final class CustomerSpecs {
    public static Specification findCustomers() {
        return new Specification() {
            public Predicate toPredicate(Root root, CriteriaQuery> query,
            CriteriaBuilder builder) {
         LocalDate date = new LocalDate().minusYears(2);
         return builder.lessThan(root.get("birthday"), date);
      }
    };
}
   
The above can be simplified using lambdas as follows
public interface CustomerRepository extends 
  CrudRepository, 
  JpaSpecificationExecutor {
  default List findCustomers() {
    return findAll(
      (root, query, cb) -> {
         LocalDate date = new LocalDate().minusYears(2);
         return builder.lessThan(root.get("birthday"), date);
      }
    );
  }
   
For more details, refer this spring doc here
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#specifications