首页 > 解决方案 > 在 JpaRepository 中,如果一个参数对于许多查询方法是通用的,那么如何在 Repository 和 Service 中尽可能好

问题描述

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);
    }

}

此处的电子邮件需要获取一次如何避免多次访问数据库或控制器中的任何其他解决方案,它需要在每个请求映射中一次又一次地提供...建议

标签: javaspringspring-data-jpa

解决方案


而不是创建一堆类似的存储库方法,您可以去规范

请参阅此处的文档:https ://docs.spring.io/spring-data/jpa/docs/current/reference/html/#specifications

您必须扩展 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/#core.extensions.querydsl


推荐阅读