首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用JPA检查记录是否存在

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

Stack Overflow用户
提问于 2010-12-07 16:35:55
回答 5查看 78.1K关注 0票数 33

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

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-12-07 16:41:07

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

异常处理的开销不是很大(除非您在正常操作期间执行了数百万次),所以我不会费心。

但是代码并不能真正反映你的意图。因为getSingleResult()在内部调用getResultList(),所以更清晰,如下所示:

代码语言:javascript
复制
public boolean objExists(...) {
    return getResultList(...).size() == 1;
}

如果您按对象id查询,并且启用了缓存,那么在对象已经加载的情况下,这将变成一个在缓存中的简单查找。

票数 32
EN

Stack Overflow用户

发布于 2015-05-07 17:45:25

尽量避免仅仅为了检查实体是否存在而将实体加载到会话(getSingleResult())中。在这里,计数更好。使用Criteria Query API,它将如下所示:

代码语言:javascript
复制
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;
}
票数 24
EN

Stack Overflow用户

发布于 2017-08-30 18:27:07

只需在查询中使用count(e),就不会抛出NoResultException,从而避免加载entity对象

因此Java代码可以如下所示:

代码语言:javascript
复制
public boolean isRecordExist() {
    String query = "select count(e) from YOUR_ENTITY e where ....";
    // you will always get a single result
    Long count = (Long) entityManager.createQuery( query ).getSingleResult();
    return ( ( count.equals( 0L ) ) ? false : true );
}

希望这对某人有帮助:)

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4374730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档