Spring 数据 JPA 不同 - Return 来自单个列的结果
Spring Data JPA Distinct - Return results from a single column
我有一些数据包含 STATE
字段 (String/Text),它定义了给定请求当前处于什么状态(例如待处理、批准拒绝等)并获取所有唯一的该列的值我可以 运行 以下 TSQL 查询
SELECT DISTINCT STATE FROM CALLOUT_REQUEST
其中 CALLOUT_REQUEST
是我的 table 姓名,STATE
是 return 类似的字段:
状态
- 批准
- 拒绝
- 待定
- ...
但是我不明白如何将其转换为存储库中的查询,因为我似乎需要一个 "by" 语句或其他一些我可以获得基于 STATE
的过滤机制在?
我正在寻找 return - 如上面的原始 TSQL 查询所示 - 是某种列表或数组对象,它包含所有 [=13] 中的所有 unique/distinct 值=] 字段。
所以在伪代码中我想我正在寻找这样的东西:
String[] states = repository.findDisinctState();
然后 findDistinctState()
会 return 一个数组。
希望这是有道理的 - 我对 Java 和 Spring 总体来说还很陌生,所以我认为我缺少一些概念知识来利用上述内容。
更新:
'state' 概念已关闭,因此我可以将其实现为一个枚举 - 唯一的问题是我不知道该怎么做 :) 我会研究如何做到这一点,因为我认为它非常适合我正在努力实现的目标。
我从提供的查询中获得的列表旨在用于计算所有出现的次数。我之前有这段代码来获得每个 'states' 的总计数:
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
了?
您可以为此使用 JPQL 查询,带有 @org.springframework.data.jpa.repository.Query
注释:
@Query("select distinct state from CalloutRequest")
List<String> findDistinctStates();
如果那个 state
概念是封闭的 - 你知道它可能的值集 - 它应该是一个枚举。
之后,您可以 create queries 像这样调用:
repository.findByState(State.APPROVED)
如果你不能创建一个枚举,你需要一个单独的方法来获取不同的值,这是 JPA 不能提供的,因为你需要一个字符串列表而不是 CalloutRequest
s。
然后你需要手动指定一个查询,如:
@Query("SELECT DISTINCT State FROM CALLOUT_REQUEST")
List<String> findDistinctStates();
如果您不想使用@Query,那么一种解决方案是使用名为“getState()”的方法创建接口“StateOnlyInterface”。
然后在您的存储库中创建名称为 getDistinctState() 的方法。 Return 此方法的类型将保留为 StateOnlyInterface 的 ArrayList。
我有一些数据包含 STATE
字段 (String/Text),它定义了给定请求当前处于什么状态(例如待处理、批准拒绝等)并获取所有唯一的该列的值我可以 运行 以下 TSQL 查询
SELECT DISTINCT STATE FROM CALLOUT_REQUEST
其中 CALLOUT_REQUEST
是我的 table 姓名,STATE
是 return 类似的字段:
状态
- 批准
- 拒绝
- 待定
- ...
但是我不明白如何将其转换为存储库中的查询,因为我似乎需要一个 "by" 语句或其他一些我可以获得基于 STATE
的过滤机制在?
我正在寻找 return - 如上面的原始 TSQL 查询所示 - 是某种列表或数组对象,它包含所有 [=13] 中的所有 unique/distinct 值=] 字段。
所以在伪代码中我想我正在寻找这样的东西:
String[] states = repository.findDisinctState();
然后 findDistinctState()
会 return 一个数组。
希望这是有道理的 - 我对 Java 和 Spring 总体来说还很陌生,所以我认为我缺少一些概念知识来利用上述内容。
更新:
'state' 概念已关闭,因此我可以将其实现为一个枚举 - 唯一的问题是我不知道该怎么做 :) 我会研究如何做到这一点,因为我认为它非常适合我正在努力实现的目标。
我从提供的查询中获得的列表旨在用于计算所有出现的次数。我之前有这段代码来获得每个 'states' 的总计数:
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
了?
您可以为此使用 JPQL 查询,带有 @org.springframework.data.jpa.repository.Query
注释:
@Query("select distinct state from CalloutRequest")
List<String> findDistinctStates();
如果那个 state
概念是封闭的 - 你知道它可能的值集 - 它应该是一个枚举。
之后,您可以 create queries 像这样调用:
repository.findByState(State.APPROVED)
如果你不能创建一个枚举,你需要一个单独的方法来获取不同的值,这是 JPA 不能提供的,因为你需要一个字符串列表而不是 CalloutRequest
s。
然后你需要手动指定一个查询,如:
@Query("SELECT DISTINCT State FROM CALLOUT_REQUEST")
List<String> findDistinctStates();
如果您不想使用@Query,那么一种解决方案是使用名为“getState()”的方法创建接口“StateOnlyInterface”。
然后在您的存储库中创建名称为 getDistinctState() 的方法。 Return 此方法的类型将保留为 StateOnlyInterface 的 ArrayList。