Java Spring数据JPA Distinct-从单个列返回结果

Java Spring数据JPA Distinct-从单个列返回结果,java,jpa,spring-data,spring-data-jpa,Java,Jpa,Spring Data,Spring Data Jpa,我有一些数据包含一个状态字段(字符串/文本),该字段定义了给定请求当前所处的状态(例如,挂起、批准、拒绝等),为了从该列获取所有唯一值,我可以运行以下TSQL查询 从调用请求中选择不同的状态 其中,CALLOUT\u REQUEST是我的表名,STATE是返回如下内容的字段: 陈述 批准 否认 未决 但是,我不明白如何将其转换为存储库中的查询,因为我似乎需要一个“by”语句或其他一些过滤机制,我可以根据这些机制获取状态 正如上面原始TSQL查询所示,我希望返回的是某种列表或数组对象,它包含

我有一些数据包含一个
状态
字段(字符串/文本),该字段定义了给定请求当前所处的状态(例如,挂起、批准、拒绝等),为了从该列获取所有唯一值,我可以运行以下TSQL查询

从调用请求中选择不同的状态

其中,
CALLOUT\u REQUEST
是我的表名,
STATE
是返回如下内容的字段:

陈述

  • 批准
  • 否认
  • 未决
但是,我不明白如何将其转换为存储库中的查询,因为我似乎需要一个“by”语句或其他一些过滤机制,我可以根据这些机制获取
状态

正如上面原始TSQL查询所示,我希望返回的是某种列表或数组对象,它包含所有
状态
字段中的所有唯一/不同值

因此,在伪代码中,我想我在寻找这样的东西:

String[]states=repository.findDisinctState()

其中
findDistinctState()
将返回排序数组

希望这是有意义的-我对Java和Spring一般来说都是新手,所以我想我缺少一些概念性的知识来利用上面的内容

更新:

“状态”的概念是封闭的,因此我可以将其作为枚举实现-唯一的问题是我不知道如何实现:)我将研究如何实现这一点,因为我认为它完全符合我试图实现的目标

我从提供的查询中获得的列表用于获取所有事件的计数。我以前用过这段代码来获取每个“状态”的总数:

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]));
}
Map stats=newhashmap();
字符串[]状态={“已批准”、“已拒绝”、“待定”、“已停用”};
for(int i=0;i

我的理解正确吗?我在上面的代码片段中拥有的状态
数组
可以转换为枚举,然后我甚至不再需要自定义
@Query

您可以使用JPQL查询,使用
@org.springframework.data.jpa.repository.Query
注释:

@Query("select distinct state from CalloutRequest")
List<String> findDistinctStates();
@Query(“从callout请求中选择不同的状态”)
列出FindDistinctState();

如果该
状态
概念已关闭-您知道其可能的值集-它应该是一个枚举

之后,您可以像以下那样调用:

repository.findByState(State.APPROVED)
如果无法创建枚举,则需要一个单独的方法来获取不同的值,这是JPA无法提供的,因为您需要的是字符串列表,而不是调用请求的列表。 然后需要手动指定查询,如:

@Query("SELECT DISTINCT State FROM CALLOUT_REQUEST")
List<String> findDistinctStates();
@Query(“从调用请求中选择不同的状态”)
列出FindDistinctState();

如果您不想使用@Query,那么有一个解决方案可以使用名为“getState()”的方法创建一个接口“StateOnlyInterface”


然后在repo中创建名为getDistinctState()的方法。此方法的返回类型将保留为StateOnlyInterface的ArrayList。

我已更新了一个问题,说明了我最初为什么要求自定义查询,以表明我需要使用它来收集返回的不同值的计数。我没有看到创建枚举的问题。只需使用所有可能的值创建一个:然后在该枚举类型的
CalloutRequest
下创建一个字段。最后,用@Enumerated(EnumType.String)注释它这是我的第一个Java应用程序这一事实是个问题,我只是不知道怎么做,但感谢您的澄清。没关系。如果您需要帮助,我可以给您发送一个示例这对我不起作用,我得到错误
找不到类型类java.lang.String的PersistentEntity
。显然,您无法从存储库返回字符串列表。这个答案是正确的,它回答了我问题的标题。我之所以将@Luis Soares answer标记为正确答案,只是因为他对解决方案进行了扩展,并就enum方法提供了指导。多谢各位-