我想知道给定记录是否存在于数据库中.到目前为止,我已经通过编写JPA查询并通过getSingleResult()方法运行它来实现这一目标.NoResultException如果具有给定参数的记录不存在,则会抛出一个.当然,记录不是必须存在的,所以这有时是正常行为,这就是为什么我问自己,是否需要抛出一个我必须通过catch块来处理的异常?据我所知,异常处理的成本相当大,所以我对这个解决方案并不是很满意,而且,我甚至不需要这个对象,我只需要知道它在DB中是否存在.
有没有更好的方法来检查对象是否存在?例如.使用getResultList()和检查它的大小可能吗?
Aar*_*lla 26
如果您只想知道对象是否存在,请将数据发送SELECT COUNT到您的数据库.那将返回0或1.
异常处理的成本并不是那么大(除非你在正常操作期间做了数百万次),所以我不会打扰.
但是代码并没有真正反映出你的意图.由于内部getSingleResult()调用getResultList(),它更清晰:
public boolean objExists(...) {
return getResultList(...).size() == 1;
}
Run Code Online (Sandbox Code Playgroud)
如果按对象ID进行查询并且启用了缓存,则如果已加载对象,则将在缓存中进行简单查找.
Rad*_*adu 18
尽量避免将实体加载到session(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;
}
Run Code Online (Sandbox Code Playgroud)
只需count(e)在您的查询中使用,这样就NoResultException不会抛出任何内容,您将避免加载实体对象
所以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 );
}
Run Code Online (Sandbox Code Playgroud)
希望有人帮助:)
| 归档时间: |
|
| 查看次数: |
53041 次 |
| 最近记录: |