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

2022-09-01 07:23:23

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

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


答案 1

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

异常处理的成本并不大(除非你在正常操作期间这样做数百万次),所以我不会打扰。

但代码并没有真正反映你的意图。由于内部调用,因此它更清晰,如下所示:getSingleResult()getResultList()

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

如果按对象 ID 进行查询并启用了缓存,则在加载对象时,这将成为缓存中的简单查找。


答案 2

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

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;
}

推荐