2016-07-06 596 views
0

我有一些數據包含定義給定請求當前處於什麼狀態(例如未決,批准拒絕等)的STATE字段(字符串/文本)並獲得從該列中的所有唯一值,我可以運行下面的TSQL查詢Spring Data JPA Distinct - 從單個列返回結果

SELECT DISTINCT STATE FROM CALLOUT_REQUEST

其中CALLOUT_REQUEST是我的表名和STATE是返回類似領域:

  • 批准
  • 否認
  • 未決
  • ...

但是我不明白我怎麼會把它轉換成一個查詢在我的倉庫,因爲它似乎我需要一個「通過「聲明或其他一些過濾機制,我可以得到基於?STATE

我想要返回的東西 - 如上面的原始TSQL查詢所示 - 是某種List或Array對象,其中包含所有STATE字段中的所有唯一/不同值。

因此,在僞代碼,我認爲我找的是這樣的:

String[] states = repository.findDisinctState();

其中findDistinctState()會再回到各種各樣的數組。

希望是有道理的 - 我對Java和Spring一般都很陌生,所以我想我缺少一些概念性知識來利用上述。

UPDATE:

「國家」的概念是關閉的,所以我可以實現,作爲一個枚舉 - 唯一的問題是我不知道該怎麼做:)虐待看看我怎麼能做到這一點,因爲我認爲它完全符合我想要實現的目標。

我從提供的查詢中獲得的列表旨在用於獲取所有出現次數。我有這個代碼之前得到一個總數爲每個「州」的:

Map stats = new HashMap(); 
String[] states = {"approved", "denied", "pending", "deactivated"}; 
for (int i = 0; i < states.length; i++) { 
    stats.put(states[i], repository.countByState(states[i])); 
} 

我在理解是正確的,我在上面的代碼片斷狀態Array也可以變成一個枚舉,然後我甚至不需要定製@Query了?

回答

1

如果「國家」的概念被關閉,你知道它的可能值的集合,它應該是一個枚舉。

之後,你可以create queries你調用,如:

repository.findByState(State.APPROVED) 

如果您不能創建一個枚舉,您需要一個單獨的方法來獲取不同的值,不能由JPA提供,因爲你需要一個字符串列表而不是CalloutRequests列表。 然後,你需要手動指定一個查詢,如:

@Query("SELECT DISTINCT State FROM CALLOUT_REQUEST") 
List<String> findDistinctStates(); 
+0

我已經更新了這個問題,爲什麼我最初詢問自定義查詢以表明我需要使用它來收集返回的Distinct值的計數。 –

+0

我沒有看到創建枚舉的問題。只需使用所有可能的值創建一個:https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html 然後在該枚舉類型的「CalloutRequest」下創建一個字段。最後,將其標註爲:@Enumerated(EnumType.String) http://tomee.apache.org/examples-trunk/jpa-enumerated/README.html –

+0

事實上,這是我的第一個Java應用程序是問題,我根本不知道該怎麼做,但謝謝你澄清。 –

2

您可以使用JPQL查詢此,與@org.springframework.data.jpa.repository.Query註釋:

@Query("select distinct state from CalloutRequest") 
List<String> findDistinctStates(); 
+0

這個答案是正確的,以及它回答我的問題的標題。我將@Luis Soares評爲正確答案的理由僅僅是因爲他擴展瞭解決方案併爲enum方法提供了指導。 謝謝 - –