spring data jpa的使用可以減少開發者對sql語句的編寫,甚至完全不需要編寫sql語句。但是,開發過程中總會遇到各種復雜的場景以及大大小小的坑。
今天項目中某個功能模塊需要用到模糊查詢。原生sql中模糊查詢關鍵字‘like',而spring data jpa的repository接口中恰恰也有實體字段對應的like。但是,如果直接使用它,那么恭喜你,你幸運地掉坑了。
spring data jpa 模糊查詢正確用法
首先,我們先創建一個實體用來存儲我們的數據
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/** * 實體 * * @author chentai * @date 18/04/22 */ @data @entity @equalsandhashcode (callsuper = true ) public class exampleentity{ @id @generatedvalue (generator = "uuid" ) @genericgenerator (name = "uuid" , strategy = "uuid" ) private string id ; private string username; private string devicenames; } |
接著,創建我們實體對應的repository接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
/** * @author chentai * @date 18/04/22 */ @repository public interface examplerepository extends crudrepository<exampleentity, string> { /** * 模糊查詢正確用法 * 其中username不支持模糊查詢,devicenames支持模糊查詢 * * @param devicenames 模糊查詢devicenames * @param username 用戶名稱 * @return {@link list<exampleentity>} */ list<exampleentity> findallbydevicenamescontainingandusername(string devicenames,string username); /** * 模糊查詢錯誤用法 * 其中username不支持模糊查詢,devicenames支持模糊查詢 * * @param devicenames 模糊查詢devicenames * @param username 用戶名稱 * @return {@link list<exampleentity>} */ list<exampleentity> findallbydevicenameslikeandusername(string devicenames,string username); } |
最后,在測試類中測試examplerepository中的兩個方法,(測試結果暫不展示)發現findallbydevicenameslikeandusername方法并沒有正確查詢到我們想要的結果,得到的結果是精確查詢的結果。而findallbydevicenamescontainingandusername得到了我們想要的模糊查詢的結果。
總結
如果想要在項目中不編寫sql原生語句的情況下使用模糊查詢,請使用containing關鍵字,而非想當然的認為原生使用like關鍵字,jpa中也是使用like關鍵字。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://www.jianshu.com/p/4960d2705b4e