在JpaRepository中,如果一个参数对于许多查询方法来说是公用的,那么如何在Repository和Service中也要使其尽可能好

时间:2018-08-03 10:43:33

标签: java spring spring-data-jpa

public interface UserRepo extends JpaRepository<User, Long> {

    public List<User> findById(long id);

    public List<User> findByEmail(String email);

    public List<User> findByEmailAndCode(String email, Code code);

    public List<User> findByEmailAndClassType(String email, ClassType code);

}

public class UserService {
    @Autowired
    UserRepo userRepo;

    public List<user> fetchByClassType(ClassType ct) {
        return userRepo.findByEmailAndClassType("email", ct);
    }

}
  

在这里,电子邮件需要获取一次,如何避免多次进入数据库或控制器中的任何其他解决方案,这需要在每个请求映射中一次又一次地给出...建议

1 个答案:

答案 0 :(得分:0)

代替创建一堆类似的存储库方法,您可以使用规范

在此处查看文档:{​​{3}}

您必须扩展JpaSecificationExecutor:

public interface CustomerRepository extends CrudRepository<Customer, Long>, JpaSpecificationExecutor {
    ...
}

然后,您将获得一个接受规范的findAll()方法。

创建如下规格:

 public static Specification<Customer> isLongTermCustomer() {
    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(_Customer.createdAt), date);
      }
    };
  }

或者,如果您不喜欢JPA Criteria API,则也可以使用 QueryDSL

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#specifications