1. 程式人生 > >Spring Data JPA 中Repository裡的方法查詢引數,需要判斷是否為空的問題

Spring Data JPA 中Repository裡的方法查詢引數,需要判斷是否為空的問題

問題:

動態查詢需要判斷引數是否為 null ,在repository裡的那樣的寫法,在網上並沒找到真正適用的寫法。

package com......pubcascade.repository.dao;

簡述:

Spring Data JPA雖然大大的簡化了持久層的開發,但是在實際開發中,很多地方都需要高階動態查詢。

使用@Query註解,這種方式可以直接在Repository裡面寫sql,但是這種方式的問題就是太麻煩了,而且非常容易出錯,擴充套件性也很差,還不如直接用mybatis。

複雜的查詢還是使用其他的方式更好(ExampleCriteria

、SpringBoot中的findAll(filterList, sort) 等等)。


解決:

暫時只能使用過載,寫兩個方法,在業務實現類層呼叫不同的方法

  1. 一個帶where條件 在引數不為空的時候呼叫;
  2. 另一個不帶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/

https://blog.csdn.net/billluffy/article/details/83147538

https://www.jianshu.com/p/0939cec7e207