Spring Data JPA Distinct - 从单个列返回结果

时间:2016-07-06 13:11:03

标签: java jpa spring-data spring-data-jpa

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

SELECT DISTINCT STATE FROM CALLOUT_REQUEST

其中CALLOUT_REQUEST是我的表名,STATE是返回类似字段的字段:

STATE

  • 批准
  • 拒绝
  • 未决
  • ...

但是我不明白如何将其转换为我的存储库中的查询,因为我似乎需要一个“by”语句或其他一些过滤机制,我可以基于它来获取STATE

我要返回的内容 - 如上面的原始TSQL查询所示 - 是某种List或Array对象,其中包含所有STATE字段中的所有唯一/不同值。

所以在伪代码中,我想我正在寻找这样的东西:

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]));
}

我是否理解上述代码段中的状态Array可以转换为枚举,然后我甚至不再需要自定义@Query

3 个答案:

答案 0 :(得分:7)

如果state概念已关闭,并且您知道它是一组可能的值,那么它应该是一个枚举。

之后你可以调用create queries

repository.findByState(State.APPROVED)

如果无法创建枚举,则需要一个单独的方法来获取JPA无法提供的不同值,因为您需要一个字符串列表而不是CalloutRequest的列表。 然后,您需要手动指定查询,如:

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

答案 1 :(得分:2)

您可以使用@org.springframework.data.jpa.repository.Query注释

为此使用JPQL查询
@Query("select distinct state from CalloutRequest")
List<String> findDistinctStates();

答案 2 :(得分:0)

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

然后在您的存储库中创建名为 getDistinctState() 的方法。该方法的返回类型保留为StateOnlyInterface的ArrayList。