首页 > 解决方案 > 用 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;
}

标签: javaspringspring-data-jpajpql

解决方案


您不能将 SQL 分组用于您想要实现的目标。

Collectors.groupingBy ()将数据集划分为组,为每个键生成一个值列表,而 SQLGROUP BY运算符进行聚合(求和、平均、计数...),为每个键生成一行。

您可以通过要求DB进行过滤来提高服务性能,但分组操作必须在服务中完成。


推荐阅读