我有一些数据包含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
?
答案 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
注释
@Query("select distinct state from CalloutRequest")
List<String> findDistinctStates();
答案 2 :(得分:0)
如果您不想使用@Query,那么有一种解决方案是使用名为“getState()”的方法创建一个接口“StateOnlyInterface”。
然后在您的存储库中创建名为 getDistinctState() 的方法。该方法的返回类型保留为StateOnlyInterface的ArrayList。