目前,我们从Spring SimpleJdbcTemplate中检索对象列表。第一个查询是select *来检索我们想要成为“密钥”的所有记录。然后,这导致在集合上的foreach循环,其反过来涉及N个查询返回到数据库,其中N是List的大小。执行这些N个查询或执行2个大的select *语句并通过执行if语句的for循环映射它们会更有效吗?请参阅以下代码:
N Queries
List keyList = Select * from keyTable;
for(Object o: keyList)
{
List valueList = Select * from valueTable;
//Map valueTable to keyTable via rowmapper
}
Y Java if statements
List keyList = Select * from keyTable;
List valueList = Select * from valueTable;
for(Object o: keyList)
{
for(Object z : valueList)
{
if(z.key == o.key) //set the value
}
}
答案 0 :(得分:2)
我不是java程序员,但让数据库执行连接不是更简单,因为大多数现代数据库引擎都是为优化连接过程而设计和构建的吗?猜测语法,你就有了查询
Select * from keyTable o
inner join valueTable z
on o.key = z.key
在你的代码中,或许是这样:
List keyValueList = select * from keyTable o inner join valueTable z on o.key = z.key;
答案 1 :(得分:1)
您的选择是:
select k.key, v.value from keyTable k, valueTable v where k.key=v.key
List keyList = Select key from keyTable; for (Object k: keyList) { List valueList = Select value from valueTable where key = k; for (Object v: valueList) { // Your code here } }
HashMap keyHash = select key, k.* from keyTable k; List valueList = select * from valueType v; for (Object k: valueList) { if (keyHash.containsKey(k)) { // Your code here } }
答案 2 :(得分:0)
您应该使用sql join或子查询在单个sql语句中检索所有数据。这将允许数据库利用可能可用的任何优化机制(索引和执行计划,缓存等)。
使用sql join:
select key,value from keyTable k, valueTable v where k.key=v.key
使用子查询(仅当键具有唯一值时):
select key, (select value from valueTable where key=k.key) from keyTable k