Spring Data JPA 中Repository裡的方法查詢引數,需要判斷是否為空的問題
阿新 • • 發佈:2018-11-08
問題:
動態查詢需要判斷引數是否為 null ,在repository裡的那樣的寫法,在網上並沒找到真正適用的寫法。
package com......pubcascade.repository.dao;
簡述:
Spring Data JPA雖然大大的簡化了持久層的開發,但是在實際開發中,很多地方都需要高階動態查詢。
使用@Query註解,這種方式可以直接在Repository裡面寫sql,但是這種方式的問題就是太麻煩了,而且非常容易出錯,擴充套件性也很差,還不如直接用mybatis。
複雜的查詢還是使用其他的方式更好(Example、Criteria
解決:
暫時只能使用過載,寫兩個方法,在業務實現類層呼叫不同的方法
- 一個帶where條件 在引數不為空的時候呼叫;
- 另一個不帶where條件,在引數為空的時候呼叫。
/** * 驗證第一層級的名稱唯一(新增時) * @param * @return */ @Query("select p from PubCascade p where p.linkName = :linkName and p.level = 1 and p.deleted = false") PubCascade validateFirstLevel(@Param("linkName") String linkName); /** * 驗證第一層級的名稱唯一(編輯時) * @param * @return */ @Query("select p from PubCascade p where p.linkName = :linkName and p.level = 1 and p.deleted = false and p.id <> :id") PubCascade validateFirstLevel(@Param("linkName") String linkName,@Param("id") Long id);
網上找到的一種寫法(未實踐):
可以試一試這裡的兩種方法:
(1)@Query( value = "SELECT * FROM sys_customer WHERE 1=1 " +
" AND if(:name!='',name LIKE CONCAT('%',:name,'%'),1=1)",
nativeQuery = true)
(2)@Query(value = "SELECT * FROM sys_customer WHERE 1=1 "+
" AND (name LIKE CONCAT('%',:name,'%') OR :name IS NULL )",
nativeQuery = true)
List<Customer> findDate(@Param("name") String name);
參考來源:
https://bbs.csdn.net/topics/390968657/