如何优化此代码,现在我只获得了循环的最后结果。 toAdd - 包含产品ID的数组。
Query query = null;
for (long l : toAdd) {
query = entityManager.createQuery("select p from Products p where p.id =:idProd", Products.class);
query.setParameter("idProd", l);
}
return (List<Products>) query.getResultList();
答案 0 :(得分:0)
您只执行一次查询,并且在执行它时,其参数的值是数组的最后一个元素,因为您在循环整个数组后执行它。 / p>
要修复代码,它应该是
List<Product> allProducts = new ArrayList<>();
for (long l : toAdd) {
query = entityManager.createQuery("select p from Products p where p.id =:idProd", Products.class);
query.setParameter("idProd", l);
allProducts.addAll(query.getResultList());
}
return allProducts;
但这效率非常低:它执行查询,因此为列表中的每个ID进行数据库往返,而不是执行一次返回所有产品的单个查询。为什么不使用更好的查询:
query = entityManager.createQuery("select p from Products p where p.id in :productIds", Products.class);
query.setParameter("productIds", toAdd);
return query.getResultList();
答案 1 :(得分:0)
您可以尝试使用IN
子句。
query = null;
query = entityManager.createQuery("select p from Products p where p.id IN :idProds", Products.class);
query.setParameter("idProds", toAdd);
return (List<Products>) query.getResultList();
答案 2 :(得分:0)
Query query = null;
query = entityManager.createQuery("select p from Products p where p.id IN(:idProd)", Products.class);
query.setParameter("idProd", toAdd.toString());
return (List<Products>) query.getResultList();
toAdd.toString()
应生成逗号分隔字符串(例如"12,24,45,16"
)