簡體   English   中英

在 Spring JPA 中解決 N 搜索的案例數量的最佳實踐是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM