用 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做过滤来提高服务性能,但是分组操作必须在服务中完成。
我有以下方法的服务:
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做过滤来提高服务性能,但是分组操作必须在服务中完成。