Java 用JPQL替换流API操作
我使用以下方法提供服务:Java 用JPQL替换流API操作,java,spring,spring-data-jpa,jpql,Java,Spring,Spring Data Jpa,Jpql,我使用以下方法提供服务: public Collection<List<GaUtm>> getGaUtmGroupedByAccountLogin(List<String> loginsOfArchivedGaAccounts) { return gaUtmRepository.findAll() .stream() .filter(gaUtm -> !loginsOfArchivedGaAccounts
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();
}
实体:
public class GaUtm {
@EmbeddedId
private GaUtmId csGaUtmId;
}
@Embeddable
public class GaUtmId implements Serializable {
@Column(name = "account_login")
private String accountLogin;
}
您不能将SQL分组用于您想要实现的目标
Collectors.groupingBy()
将数据集划分为多个组,为每个键生成一个值列表,而SQLgroupby
操作符进行聚合(求和、平均、计数…),为每个键生成一行
您可以通过请求DB进行过滤来提高服务性能,但分组操作必须在服务中完成。您不能使用SQL分组来实现您想要实现的目标
Collectors.groupingBy()
将数据集划分为多个组,为每个键生成一个值列表,而SQLgroupby
操作符进行聚合(求和、平均、计数…),为每个键生成一行
您可以通过请求DB进行过滤来提高服务性能,但分组操作必须在服务中完成。正如前面提到的
Etienne Miret
一样,您不能使用SQL/JPA QL直接生成所需的结果。至少不需要对每个组执行单独的查询。我不认为这是正确的做法。最接近的方法是执行操作,其中
过滤掉不需要的数据,并按分组属性排序,然后迭代结果,并在分组属性更改后立即启动新的分组。实际上,只需执行WHERE
子句并在流中保留collect
(并在流中去掉filter
),就可以了。正如Etienne Miret
提到的,您不能使用SQL/JPA QL直接生成所需的结果。至少不需要对每个组执行单独的查询。我不认为这是正确的做法。最接近的方法是执行操作,其中
过滤掉不需要的数据,并按分组属性排序,然后迭代结果,并在分组属性更改后立即启动新的分组。实际上,只需执行WHERE
子句并在流中保留collect
(并在流中去掉过滤器)就足够了。
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;
}