场景:包含以下DTO的Arraylist。
MetadatRetrievalDTO[] dto = new MetadatRetrievalDTO[16];
dto[0] = new MetadatRetrievalDTO();
dto[0].setArticleId(11);
dto[0].setBaseId("SB11");
dto[0].setMetadataName("TYPE");
dto[0].setMetadataValue("RANCH");
dto[1] = new MetadatRetrievalDTO();
dto[1].setArticleId(11);
dto[1].setBaseId("SB11");
dto[1].setMetadataName("PRICE");
dto[1].setMetadataValue("1200000");
dto[2] = new MetadatRetrievalDTO();
dto[2].setArticleId(11);
dto[2].setBaseId("SB11");
dto[2].setMetadataName("STATE");
dto[2].setMetadataValue("NJ");
dto[3] = new MetadatRetrievalDTO();
dto[3].setArticleId(11);
dto[3].setBaseDocId("SB11");
dto[3].setMetadataName("REGION");
dto[3].setMetadataValue("NE");
//////////////////////////////////////////////////////
dto[4] = new MetadatRetrievalDTO();
dto[4].setArticleId(12);
dto[4].setBaseId("SB12");
dto[4].setMetadataName("TYPE");
dto[4].setMetadataValue("RANCH");
dto[5] = new MetadatRetrievalDTO();
dto[5].setArticleId(12);
dto[5].setBaseId("SB12");
dto[5].setMetadataName("PRICE");
dto[5].setMetadataValue("1200001");
dto[6] = new MetadatRetrievalDTO();
dto[6].setArticleId(12);
dto[6].setBaseId("SB12");
dto[6].setMetadataName("STATE");
dto[6].setMetadataValue("NJ");
dto[7] = new MetadatRetrievalDTO();
dto[7].setArticleId(12);
dto[7].setBaseId("SB12");
dto[7].setMetadataName("REGION");
dto[7].setMetadataValue("NE");
//////////////////////////////////////////////////////
dto[8] = new MetadatRetrievalDTO();
dto[8].setArticleId(13);
dto[8].setBaseId("SB13");
dto[8].setMetadataName("TYPE");
dto[8].setMetadataValue("RANCH");
dto[9] = new MetadatRetrievalDTO();
dto[9].setArticleId(13);
dto[9].setBaseId("SB13");
dto[9].setMetadataName("PRICE");
dto[9].setMetadataValue("1200002");
dto[10] = new MetadatRetrievalDTO();
dto[10].setArticleId(13);
dto[10].setBaseId("SB13");
dto[10].setMetadataName("STATE");
dto[10].setMetadataValue("NJ");
dto[11] = new MetadatRetrievalDTO();
dto[11].setArticleId(13);
dto[11].setBaseId("SB13");
dto[11].setMetadataName("REGION");
dto[11].setMetadataValue("NE");
//////////////////////////////////////////////////////
dto[12] = new MetadatRetrievalDTO();
dto[12].setArticleId(14);
dto[12].setBaseId("SB14");
dto[12].setMetadataName("TYPE");
dto[12].setMetadataValue("RANCH");
dto[13] = new MetadatRetrievalDTO();
dto[13].setArticleId(14);
dto[13].setBaseId("SB14");
dto[13].setMetadataName("PRICE");
dto[13].setMetadataValue("1200003");
dto[14] = new MetadatRetrievalDTO();
dto[14].setArticleId(14);
dto[14].setBaseId("SB14");
dto[14].setMetadataName("STATE");
dto[14].setMetadataValue("NH");
dto[15] = new MetadatRetrievalDTO();
dto[15].setArticleId(14);
dto[15].setBaseId("SB14");
dto[15].setMetadataName("REGION");
dto[15].setMetadataValue("NE");
其中BaseID对于每篇文章都是唯一的。搜索条件是:
HashMap<String,String> queryParams = new HashMap<String, String>();
queryParams.put("TYPE","RANCH");
queryParams.put("STATE","NJ");
queryParams.put("REGION","NE");
我想要获得满足queryParams
的所有DTO。
因此,所需的ArrayList应该包含与queryParams
匹配的所有记录,因此在我的情况下,它应该排除具有基本ID = SB14的最后一篇文章,因为在本文中State
是NH
。如何构建返回这些结果的查询?
答案 0 :(得分:0)
for (MetadatRetrievalDTO dto : dtos) {
for (Map.Entry entry : queryParams.entrySet()) {
if (dto.getMetadataName().equals(entry.getKey()) && dto.getMetadataValue().equals(entry.getValue())) {
// dto matches
}
} }
不确定这是不是你的意思......但你应该考虑索引或类似的东西......
答案 1 :(得分:0)
您可能需要重新考虑数据结构。您目前设置它们的方式,创建高效搜索将非常困难。如果我理解你在寻找什么,下面的代码应该能得到你想要的结果:
private Set filter(MetadatRetrievalDTO[] data, Map<String, String> filter) {
Set<Integer> rtnIdSet = new HashSet();
for (MetadatRetrievalDTO dto : data) {
rtnIdSet.add(dto.getArticleId());
}
Set<Integer> filterSet = new HashSet();
for (String key : filter.keySet()) {
filterSet.clear();
String value = filter.get(key);
for (MetadatRetrievalDTO dto : data) {
if (key.equals(dto.getMetadataName()) && value.equals(dto.getMetadataValue())) {
filterSet.add(dto.getArticleId());
}
}
rtnIdSet.retainAll(filterSet);
}
return rtnIdSet;
}
这是优化的吗?不会。它会返回DTO的阵列吗?不会。但是,它会返回符合您的过滤条件的文章ID列表。如果需要,您可以轻松扩展它以返回dtos列表。
答案 2 :(得分:0)
这是一个糟糕的数据结构。像Map<Long,Map<Field, String>>
这样的东西要好得多,其中Long
是articleId,Field
是字段名称的枚举,String
是字段值。对于查询,您还可以维护字段/值对到ids的逆映射。
或者更好的是,在ORM / JPA框架中完成所有这些工作,让DBMS为您完成所有艰苦的工作。