2016-07-06 1385 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方法提供了指导。 谢谢 - –