How to use Criteria Queries in Spring Boot Data Jpa Application

Viewed 57381

I have an application that uses Spring Boot Data jpa . So far i am using a repository like this

public interface StudentRepository extends CrudRepository<StudentEntity, Integer>{
    @Query(value = "" 
        + "SELECT s.studentname "
        + "FROM   studententity s, "
        + "       courseentity c "
        + "WHERE  s.courseid = c.courseid "
        + "       AND s.courseid IN (SELECT c.courseid "
        + "                          FROM   courseentity c "
        + "                          WHERE  c.coursename = ?1)")
    List<String> nameByCourse(String coursename);
}

How can i make use of Criteria Query that Hibernate provides for such cases in a Spring Boot Application

5 Answers

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<Customer, Long>, 
  JpaSpecificationExecutor<Customer> {

  default List<Customer> findCustomers() {
    return findAll(CustomerSpecs.findCustomers());
  }

Then create a customer specs

public final class CustomerSpecs {

    public static Specification<Customer> findCustomers() {
        return new Specification<Customer>() {
            public Predicate toPredicate(Root<Customer> 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<Customer, Long>, 
  JpaSpecificationExecutor<Customer> {

  default List<Customer> 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

Related