Jpa如何返回带有很多参数的查询

时间:2016-04-12 20:25:29

标签: jpa

如何优化此代码,现在我只获得了循环的最后结果。 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();

3 个答案:

答案 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"