java - JPA Criteria查询与迭代

标签 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
      }
    }

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

最佳答案

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

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

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

  • 表中的所有对象都必须实例化 - 根据记录的数量,这可能会非常昂贵,最终会突破虚拟机的内存限制。

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

关于java - JPA Criteria查询与迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23910154/

相关文章:

java - Hibernate 对 Select 执行删除

java - 我们可以对 JPA 标准表达式进行左填充吗?

java - 如何使用 hibernate JPA 注释连接两列

java - 如果编译一个空的 java 文件会发生什么?

java - 用 JNA 包装 BSD select()

java - 安卓,群 : how to download multiple leaderboards on the same thread?

java - 仅删除连接表中的一行

Java min max 0 终止

java - 如何将 JSpinner 的文本居中

java - 使用 Hibernate/JPA 设置密码运行时