如何在Spring數據中使用至少三個參數之一編寫JPA查詢?在WHERE條件中使用參數組合的Spring JPA自定義查詢?
我有以下三個參數:
- ID(PK)
- 名稱
- 姓
客戶必須提供這三個參數中的至少一個,我想找到用戶通過這些非空參數。
是否可以創建這樣的自定義查詢到我的存儲庫或我必須創建所有可能的WHERE
條件組合的自定義查詢?
如何在Spring數據中使用至少三個參數之一編寫JPA查詢?在WHERE條件中使用參數組合的Spring JPA自定義查詢?
我有以下三個參數:
客戶必須提供這三個參數中的至少一個,我想找到用戶通過這些非空參數。
是否可以創建這樣的自定義查詢到我的存儲庫或我必須創建所有可能的WHERE
條件組合的自定義查詢?
您可以讓存儲庫擴展org.springframework.data.querydsl.QueryDslPredicateExecutor並使用繼承的findAll(謂詞謂詞)方法使用任意參數組合進行查詢。
你不會那麼寫任何查詢方法:
http://docs.spring.io/spring-data/jpa/docs/1.10.5.RELEASE/reference/html/#core.extensions.querydsl
您還可以使在一個Spring MVC控制器自動綁定的謂語這裏詳述:
https://spring.io/blog/2015/09/04/what-s-new-in-spring-data-release-gosling#querydsl-web-support
和這裏:
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#core.web.type-safe
因此,您的控制器可以自動處理搜索1,2或全部3個參數作爲請求參數傳遞,而無需編寫任何代碼。
嗯,它看起來很有趣。 – Artegon
這是您需要在運行時創建動態查詢的能力。
在您的應用程序代碼中,您應該根據輸入DTO中每個上述屬性是否爲空來構建謂詞。
一種方法是使用QueryDSL。 要使用QueryDSL,您應該在您的pom/gradle文件中包含相關的依賴項,然後您的存儲庫應該擴展QueryDslPredicateExecutor接口。這會給你兩個額外的通用查找方法。
T findAll(Predicate) or Page<T> findAll(Predicate, Pageable)
有一點要記住的是,上述兩種方法是適當的地方,這是沒有必要做一個加入
在這裏你的要求似乎是一個單一的表查詢,所以任何一個的取景器方法應該足夠了。
如果您確實需要與其他表進行連接,並且需要對JOIN的發生方式進行細化控制(INNER JOIN vs LEFT OUTER JOIN vs CROSS JOIN)等,那麼您應該考慮創建一個定製存儲庫,延伸。 然後提供您現在可以從存儲庫訪問的customImpl。
非常感謝回覆......因爲我閱讀Spring並不像其他框架那樣靈活......因此,我嘗試了一些節點js api框架,它更簡單,更靈活..你怎麼看待這個 ?
使用自定義存儲庫方法,並使用JPA標準API動態生成您的查詢。這就是它的目的。 –
謝謝,我會看看它。 – Artegon