java - 在 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);
}
}
此处的电子邮件需要获取一次如何避免多次访问数据库或控制器中的任何其他解决方案,它需要在每个请求映射中一次又一次地提供...建议
解决方案
而不是创建一堆类似的存储库方法,您可以去规范。
请参阅此处的文档: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
推荐阅读
- angular - 从服务文件到 app.module 获取值的最佳方法
- angular - 需要转换具有父子关系的对象数组并转换为primeng树表节点
- android - Kotlin Dagger2 - 找不到符号 DataBindingComponent
- android - 显示周数/日历周
- eureka-forms - UICollectionView 嵌入到 Eureka 自定义行中
- python - networkx 中 minimum_spanning_arborescence 背后的算法是什么?
- python - openssl sha1 在终端与 Python 中给出不同的结果
- sql - 获取特定个体的所有孩子(基于树的层次结构)
- polymer - Lit-Element 不允许我在 html 中设置属性值
- sql - 如何在 Oracle SQL 中将一种格式的日期作为输入并输出另一种格式的日期?