如何使用JPA检查记录是否存在

新手上路,请多包涵

我想知道给定记录是否存在于数据库中。到目前为止,我已经通过编写 JPA 查询并通过 getSingleResult() 方法运行它来实现这一点。这将抛出 NoResultException 如果具有给定参数的记录不存在。当然,记录不是必须存在的,所以有时这是正常行为,这就是为什么我问自己,是否有必要抛出一个我必须由 catch 块处理的异常?据我所知,异常处理的成本相当大,所以我对这个解决方案不是很满意,而且,我什至不需要对象,我只需要知道它存在于数据库中即可。

有没有更好的方法来检查对象是否存在?例如。使用 getResultList() 并检查它的大小?

原文由 Balázs Németh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 988
2 个回答

如果您只想知道该对象是否存在,请将 SELECT COUNT 发送到您的数据库。这将返回 0 或 1。

异常处理的成本并没有那么大(除非您在正常操作期间执行了数百万次),所以我不会打扰。

但是代码并不能真正反映您的意图。由于 getSingleResult() 调用 getResultList() 在内部,它更清晰:

 public boolean objExists(...) {
    return getResultList(...).size() == 1;
}

如果您按对象 ID 查询并且启用了缓存,那么如果对象已经加载,这将成为缓存中的简单查找。

原文由 Aaron Digulla 发布,翻译遵循 CC BY-SA 2.5 许可协议

尽量避免将实体加载到会话中 ( getSingleResult() ) 只是为了检查它是否存在。计数在这里更好。使用 Criteria Query API,它看起来像这样:

 public <E extends AbstractEntity> boolean exists(final Class<E> entityClass, final int id) {
    final EntityManager em = getEntityManager();
    final CriteriaBuilder cb = em.getCriteriaBuilder();

    final CriteriaQuery<Long> cq = cb.createQuery(Long.class);
    final Root<E> from = cq.from(entityClass);

    cq.select(cb.count(from));
    cq.where(cb.equal(from.get(AbstractEntity_.id), id));

    final TypedQuery<Long> tq = em.createQuery(cq);
    return tq.getSingleResult() > 0;
}

原文由 Radu 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题