Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用JPQL替换流API操作_Java_Spring_Spring Data Jpa_Jpql - Fatal编程技术网

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()
将数据集划分为多个组,为每个键生成一个值列表,而SQL
groupby
操作符进行聚合(求和、平均、计数…),为每个键生成一行


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

您不能使用SQL分组来实现您想要实现的目标

Collectors.groupingBy()
将数据集划分为多个组,为每个键生成一个值列表,而SQL
groupby
操作符进行聚合(求和、平均、计数…),为每个键生成一行


您可以通过请求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;
}