我想知道在 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/