2017-05-04 83 views
9

我想要一個彈簧數據存儲庫接口,它需要兩個參數。有沒有辦法讓它具有以下行爲?彈簧數據 - 忽略參數,如果它有一個空值

MyObject findByParameterOneAndParameterTwo(String parameterOne, String parameterTwo); 

如果兩個參數有一個值,我想這是正常的行爲,做一個「和」兩個值。

例如,如果第二個參數爲空的話,那就只能通過ParameterOne

任何建議搜索?

+1

從Spring數據庫提供的存儲庫方法名稱中派生查詢的機制適用於查詢事先已知的情況。期望該機制與只在運行時精確知道的查詢一起工作是不現實的。對於動態情況,還有其他幾個選項,例如'@ Query'和QueryDSL。 SQL和JPA支持'COALESCE'函數,它可以用於解決有時可能具有NULL值的參數。 '@Query(「SELECT e FROM MyObject e WHERE COALESCE(e.parameterOne,?1)=?1 AND COALESCE(e.parameterOne,?2)=?2」)'should be working。 – manish

+1

@manish我認爲'COALESCE(?1,e.parameterOne)= e.parameterOne'是你的口頭表達。 – Blank

+0

@Forward,我只給了一個海報的方向,因爲我不確定海報如何讓這個匹配完全起作用。例如,尚未指定數據庫是否可以爲這些列包含「空值」,如果是,應如何匹配工作等等。但是,是的,只是基於已發佈的內容,您的評論很重要。 – manish

回答

6

我不知道這是可能的倉庫方法命名,但你可以使用@Query

(:parameterOne is null or parameter1 = :parameterOne) and (:parameterTwo is null or parameter2 = :parameterTwo) 
+1

也許'isnull'應該改爲'is null'? – Searene

+0

@Searene,是的,你是對的 –

5

目前,這是不可能的Spring-data-jpa

有對此目前仍在由Spring調查一個JIRAticket

但是,如果您想要一種解決方法,您可以簽出一個簡單的標準查詢示例here

0

我不確定它是否可以使用Repo作爲單獨的類,但是您可以使用StringBuilder附加查詢和選項參數。這肯定會起作用

StringBuilder queryBuilder = new StringBuilder(); 
    queryBuilder.append("select p.name from personDemographic p "); 
    Boolean flag = true; 
    if(parameterOne != null){ 
     if(flag){ 
      queryBuilder.append("where condition..."); 
      flag=false; 
     } 
     } 
    if(parameterOne != null){ 
    if(flag){ 
    queryBuilder.append("where condition..."); 
    flag = false; 
    }else{ 
     queryBuilder.append("and condition..."); 
    } 
    Query query = entityManager.createQuery(queryBuilder.toString());