JPA CriteriaQuery vs Iteration

时间:2014-05-28 11:17:07

标签: java jpa

我想知道在JPA中处理where语句的首选方法。

有两种方式。

您可以使用标准查询,例如

 CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Profile> c = cb.createQuery(Profile.class);
    Root<Profile> root = c.from(Profile.class);
    c.where(cb.equal(root.get(Profile_.email), email));
    List<Profile> resultList = em.createQuery(c).getResultList();

或者你选择整个表并在java中迭代

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Profile> c = cb.createQuery(Profile.class);
//    Root<Profile> root = c.from(Profile.class);
//    c.where(cb.equal(root.get(Profile_.email), email));
    List<Profile> resultList = em.createQuery(c).getResultList();

    for (Profile profile : resultList) {
      if (profile.getEmail().equals(email)) {
        //todo
      }
    }

首选方式是什么,存在哪些优点和缺点?

1 个答案:

答案 0 :(得分:3)

第一种情况下的结果选择可以比第二种情况中的实例过滤快几个数量级执行。

数据库在选择数据方面非常快速有效,因此我不知道第一种方法有任何缺点。

第二种方法的缺点是在使用第一种方法时不需要执行的任务:

  • 必须实例化表中的所有对象 - 这取决于记录的数量,这可能非常昂贵,最终会破坏VM的内存限制。

  • 必须迭代所有对象,调用一些方法,进行比较,垃圾收集不需要的实例 - 再次浪费时间和资源。