用 JPQL 替换 Stream API 操作

Replace Stream API operation with JPQL

我有以下方法的服务:

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数据+JPQL替换:

@Repository
public interface GaUtmRepository extends JpaRepository<GaUtm, GaUtmId> {

 @Query(...)
 Collection<List<GaUtm>> findGaUtmGroupedByAccountLogin(List<String> loginsOfArchivedGaAccounts);

}

我无法按分组依据进行分组,我应该按什么进行分组 select:

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 () 将您的数据集分成几组,为每个键生成一个值列表,而 SQL GROUP BY 运算符进行聚合(总和、平均、计数...) , 为每个键生成一行。

可以通过让DB做过滤来提高服务性能,但是分组操作必须在服务中完成。