java - 用 JPQL 替换 Stream API 操作
问题描述
我有以下方法的服务:
public Collection<List<GaUtm>> getGaUtmGroupedByAccountLogin(List<String> loginsOfArchivedGaAccounts) {
return gaUtmRepository.findAll()
.stream()
.filter(gaUtm -> !loginsOfArchivedGaAccounts.contains(gaUtm.getGaUtmId().getAccountLogin()))
.collect(Collectors.groupingBy(gaUtm -> gaUtm.getGaUtmId().getAccountLogin())).values();
}
我想用 Spring Data + JPQL 替换它:
@Repository
public interface GaUtmRepository extends JpaRepository<GaUtm, GaUtmId> {
@Query(...)
Collection<List<GaUtm>> findGaUtmGroupedByAccountLogin(List<String> loginsOfArchivedGaAccounts);
}
我坚持分组依据,我应该选择什么:
SELECT ... FROM GaUtm utm.. WHERE utm.gaUtmId.accountLogin NOT IN :loginsOfArchivedGaAccounts
实体:
public class GaUtm {
@EmbeddedId
private GaUtmId csGaUtmId;
}
@Embeddable
public class GaUtmId implements Serializable {
@Column(name = "account_login")
private String accountLogin;
}
解决方案
您不能将 SQL 分组用于您想要实现的目标。
Collectors.groupingBy ()
将数据集划分为组,为每个键生成一个值列表,而 SQLGROUP BY
运算符进行聚合(求和、平均、计数...),为每个键生成一行。
您可以通过要求DB进行过滤来提高服务性能,但分组操作必须在服务中完成。
推荐阅读
- c - 遇到错误 - c 编程
- perl - 我怎样才能使 perl 可以识别未知模式?
- javascript - 除了在 `for` 循环中之外,`in` 关键字是否有用?
- c - 为什么我在编译基本的 yacc 程序时会得到 yylex 和 yyerror 的未定义符号?
- docker - 2个容器之间的API通信
- javascript - 根据属性值按组过滤对象数组 - 来自 JSON 响应的数据
- asp.net-mvc - 用于注销的布局中的 RedirectoAction 问题
- apache-spark - 如何在pyspark中的多个逻辑偏移窗口中重用相同的分区?
- json - 如何提取返回的 json 对象的特定值?
- android - App_HiltComponents.ActivityC 范围为 @dagger.hilt.android.scopes.ActivityScoped 可能不会引用具有不同范围的绑定