簡體   English   中英

如何在Spring Data JPA中使用多個可為空的參數編寫查詢?

[英]How to write query in Spring Data JPA with multiple nullable parameters?

我有一個像這樣的Entity類:

class EntityClass {
    UUID id;
    String param1, param2, param3;
    //Getters and Setters
}

我的Service類將具有這樣的方法來利用所有此類列,並且我希望能夠使用相同的存儲庫方法處理所有請求,而不是針對每種情況都使用多個存儲庫方法來組合參數空值。

class ServiceClass {
    List<EntityClass> getAllBy(List<String> param1, List<String> param2, String param3) {
        return repositoryInterface.customFindAll(param1, param2, param3);
    }
}

現在,我的存儲庫類應具有此方法。 但我希望能夠處理{param1,param2,param3}的任何組合都可以為null的情況,如{param1 = null或空,param2!= null,param3!= null}或{param1 = null或空,param2 = null或為空,param3!= null}等。

倉庫方法customFindAll基本上應該能夠搜索實體表,以檢查param1列值是否在所發送的值的列表等中,如果不為null

那么我應該如何在Spring JPA中處理本機查詢來做到這一點,而不是為不同的組合創建不同的方法?

interface RepositoryInterface extends JpaRepository<EntityClass, UUID> {
    @Query(value = "FILL THE QUERY", nativeQuery = true)
    List<EntityClass> customFindAll(@Param("param1") List<String> param1, @Param("param2") List<String> param2, @Param("param3") String param3)
}

通用的方法是使用如下的where子句:

WHERE (:param1 IS NULL OR param1 IN :param1) ...

但是我不認為您可以對列表值的綁定參數執行is null檢查。 但是您可以為此使用SpEL表達式

這應該可以解決問題:

SELECT id, param1, param2, param3
FROM EntityClass
WHERE (:#{#param1 == null ? 0 : 1} = 0 OR param1 IN :param1) 
AND   (:#{#param2 == null ? 0 : 1} = 0 OR param2 IN :param2) 
AND   (:#{#param3 == null ? 0 : 1} = 0 OR param3 IN :param3) 

該注釋可能是正確的:空或null參數上的IN可能只是不解析為合法的SQL語句。 在這種情況下,您可以使用更大的SpEL力(如上所述重復三遍):

( param1 IN :#{(#param1 == null || #param1.isEmpty()) ? java.util.Collections.singletonList(#param1) : #param1})

當然,所有這些都變得很丑陋,因此使用Specifications動態創建查詢可能會更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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