我想知道给定的记录是否存在于数据库中。到目前为止,我已经通过编写一个JPA查询并通过getSingleResult()
方法运行它来实现这一点。如果带有给定参数的记录不存在,则会抛出NoResultException
。当然,这不是记录存在的必要条件,所以有时这是正常的行为,这就是为什么我问自己,有必要抛出一个异常,我必须通过catch块来处理它吗?据我所知,异常处理的开销相当大,所以我对这个解决方案不是很满意,而且,我甚至不需要对象,我只需要知道它在数据库中的存在。
有没有更好的方法来检查对象是否存在?例如:使用getResultList()
并检查它的大小?
发布于 2010-12-07 16:41:07
如果您只想知道对象是否存在,请向数据库发送一个SELECT COUNT
。这将返回0或1。
异常处理的开销不是很大(除非您在正常操作期间执行了数百万次),所以我不会费心。
但是代码并不能真正反映你的意图。因为getSingleResult()
在内部调用getResultList()
,所以更清晰,如下所示:
public boolean objExists(...) {
return getResultList(...).size() == 1;
}
如果您按对象id查询,并且启用了缓存,那么在对象已经加载的情况下,这将变成一个在缓存中的简单查找。
发布于 2015-05-07 17:45:25
尽量避免仅仅为了检查实体是否存在而将实体加载到会话(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;
}
发布于 2017-08-30 18:27:07
只需在查询中使用count(e)
,就不会抛出NoResultException
,从而避免加载entity对象
因此Java代码可以如下所示:
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 );
}
希望这对某人有帮助:)
https://stackoverflow.com/questions/4374730
复制相似问题