【发布时间】:2020-06-11 13:22:22
【问题描述】:
我有一个名为证书的实体
@Entity
public class CertificateData {
@Id private String id;
private long expireDate;
private long createDate;
private int status;
private String subjectDN;
...
}
许多证书可以具有相同的主题,我想选择所有主题 ID 字段计数不同于 3 的证书。我使用了此代码并且它有效
public List<CertificateData> findAllByRedundancy() {
Map<String, Integer> subjectDNCount = new HashMap<>();
Map<String, List<CertificateData>> subjectDNCertificates = new HashMap<>();
List<CertificateDto> certificateDataList =
this.certificaterepository
.findAll().forEach(certificateData -> {
String subject = certificateData.getSubjectDN();
if(subjectDNCount.containsKey(subject)){
subjectDNCount.put(subject, subjectDNCount.get(subject)+1);
subjectDNCertificates.get(subject).add(certificateData);
}
else{
subjectDNCount.put(subject, 1);
subjectDNCertificates.put(subject, new ArrayList<>());
subjectDNCertificates.get(subject).add(certificateData);
}
});
List<CertificateDto> result = new ArrayList<>();
subjectDNCount.forEach((s, i) -> {
if(i!=3){
result.addAll(subjectDNCertificates.get(s));
}
});
return result;
}
我尝试使用带有查询注释的 Spring JPA 来做同样的事情,如下所示:
@Query("select c from CertificateData c group by c.subjectDN Having count(c) <> 3")
List<CertificateData> findAllByRedundancy();
但它不会返回所有证书。它只返回不同主题DN的证书。
【问题讨论】:
标签: java spring-boot spring-data-jpa jpql