如何使用SearchCriteria类在spring数据jpa

时间:2018-08-28 06:18:51

标签: java spring jpa search spring-data-jpa

我有一个名为SearchCriteria的类,其中有一些用户可以搜索的属性。 如何将此类与spring data jpa一起使用以搜索数据。在下面的示例中。 我正在使用JpaRepository创建存储库。 我是否也应该为SearchCriteria创建存储库,也不需要相同的实体或执行任何此操作的方法。

@Entity
class User{  

    @Id
    id;

    fname;
    lname;
    location;
    orders;
    posts;

    //getters & setters
}


class SearchCritiea {
    int radius;//search user in given diameter 
    String fname;
    int ordercount;//search users with oder count  
}

2 个答案:

答案 0 :(得分:0)

您可以使用javax.persistence.criteria.CriteriaQuery动态定义查询:

https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/

答案 1 :(得分:0)

您可以使用“规范”来定义可重复使用的谓词:

public CustomerSpecifications {

public static Specification<Customer> customerHasBirthday() {
return new Specification<Customer> {
  public Predicate toPredicate(Root<T> root, CriteriaQuery query, CriteriaBuilder cb) {
    return cb.equal(root.get(Customer_.birthday), today);
   }
 };

}

public static Specification<Customer> isLongTermCustomer() {
return new Specification<Customer> {
  public Predicate toPredicate(Root<T> root, CriteriaQuery query, CriteriaBuilder cb) {
    return cb.lessThan(root.get(Customer_.createdAt), new LocalDate.minusYears(2));
    }
   };
  }
}

现在您可以使用与AND或NOT NOT OPERATION链接的谓词:

  customerRepository.findAll(where(customerHasBirthday()).and(isLongTermCustomer()));

请参阅春季官方博客条目:https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/