[英]What is the best practice for solving the number of cases of N searches in Spring JPA?
解決 N 次搜索的案例數的最佳做法是什么?
我有3個搜索條件。 有A、B、C的搜索條件。
在這種情況下,可能的情況的數量是 僅搜索 A 僅搜索 B 僅搜索 C 僅搜索 AB 僅搜索 AC 僅搜索 BC 僅搜索 ABC
上述情況,一共有6個這樣的情況。(3個!)
不假思索地映射所有病例的數量
@GetMapping("/A/{A}/B/{B}/C/{C}")
public ReturnType MethodName(@PathVariable AClass A
@PathVariable BClass B,
@PathVariable CClass C) {
return service.findByAandBandC(A, B, C);
...
我必須像上面那樣創建 6 個控制器方法。
With 4 search conditions, need 24 methods (4! = 4 * 3 * 2)
If there are 5 search conditions, need 120 methods (5! = 5 * 4 * 3 * 2)
如上所述,它呈指數增長。
我沒有將所有案例都作為一種方法,而是想知道是否有最佳實踐。
如果可能,將不勝感激任何使用 spring data jpa 的答案。
此致!
不要為每個搜索選項創建不同的控制器,而是嘗試使用一個控制器。 假設您有一個端點來獲取所有用戶的列表。
@GetMapping
public List<User> listAll() {
return service.listAll();
}
在地圖中接受查詢參數是一個很好的解決方案。 更改方法簽名並將查詢參數映射傳遞給服務:
@GetMapping
public List<User> listAll(@RequestParam Map<String, String> queryParams) {
return service.listAll(queryParams);
}
這樣您就可以接受動態數量的搜索選項。 在您的服務類中使用Spring JPA Specification 。 要執行規范,您的存儲庫接口需要擴展JpaSpecificationExecutor<T>
接口。
public List<User> listAll(Map<String, String> queryParams) {
return repository.findAll(createSpec(queryParams));
}
private Specification<User> createSpec(Map<String, String> queryParams) {
return (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
String value = queryParams.get("email");
if(StringUtils.isNotBlank(value)) {
Predicate email = criteriaBuilder.like(root.get("email"), "%" + value + "%");
predicates.add(name);
}
value = queryParams.get("name");
if(StringUtils.isNotBlank(value)) {
Predicate name = criteriaBuilder.like(root.get("name"), "%" + value + "%");
predicates.add(name);
}
return criteriaBuilder.and(predicates.toArray(Predicate[]::new));
};
}
當需要添加更多搜索選項時,您可以在createSpec()
方法中添加它們,而不會破壞現有的 API 契約或添加更多方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.