Hibernate 休眠:检查对象是否存在

Hibernate 休眠:检查对象是否存在,hibernate,Hibernate,假设,类型A的对象存储在DB中。下面是我使用hibernate从DB加载特定数据库的方法: org.hibernate.Session session = ...; long id = 1; A obj = session.load(A.class, id); 如果id=1的对象不存在,我将获取ObjectNotFoundException。但是有没有一种方法可以在不捕获异常的情况下检查这样的对象是否存在?我想要的是smth,比如: org.hibernate.Session session

假设,类型A的对象存储在DB中。下面是我使用hibernate从DB加载特定数据库的方法:

org.hibernate.Session session = ...;
long id = 1;
A obj = session.load(A.class, id);
如果id=1的对象不存在,我将获取ObjectNotFoundException。但是有没有一种方法可以在不捕获异常的情况下检查这样的对象是否存在?我想要的是smth,比如:

org.hibernate.Session session = ...;
long id = 1;
boolean exists = session.exists(A.class, id);
if(exists){
 // do smth.....
}

找不到它hibernate docs…

您可以使用会话。获取:

public Object get(Class clazz,
                  Serializable id)
           throws HibernateException

如果对象在数据库中不存在,它将返回null。您可以在中找到更多信息

您可以使用HQL检查对象是否存在:

public Boolean exists (DTOAny instance) {
    Query query = getSession().             
    createQuery("select 1 from DTOAny t where t.key = :key");
        query.setString("key", instance.getKey() );
    return (query.uniqueResult() != null);
}

HibernatesuniqueResult()方法在未找到数据时返回null。通过使用HQL,您可以创建更复杂的查询标准。

Hibernate

仅获取密钥以获得最佳性能:

public boolean exists(Class clazz, String idKey, Object idValue) {
    return getSession().createCriteria(clazz)
            .add(Restrictions.eq(idKey, idValue))
            .setProjection(Projections.property(idKey))
            .uniqueResult() != null;
}
JPA

由于Hibernate是JPA的一个实现,因此可以使用EntityManager。此方法也有很好的性能,因为它支持以下实例:

public boolean exists(Class clazz, Object key) {
   try {
      return entitymanager.getReference(Entity.class, key) != null;
   } catch (EntityNotFoundException.class) {
      return false;
   }
}

@Journeycorner的一种简化方法

public boolean exists(Class<?> clazz, Object idValue) {
    return getSession().createCriteria(clazz)
            .add(Restrictions.idEq(idValue))
            .setProjection(Projections.id())
            .uniqueResult() != null;
}

隐马尔可夫模型。。。无论我使用“load”还是“get”,我仍然会得到相同的结果(ObjectNotFoundException)。可能您是从上一个会话中得到异常。load()?在ObjectNotFoundException文档中:“调用load()时可能不会引发此异常,因为如果可能,load()会返回代理。使用Session.get()测试数据库中是否存在行。”get可以工作,但这是一种缓慢的方法,因为Hibernate必须获取所有列并将其影响到新对象,并将其存储在会话中。如果你不想无用地浪费资源,就应该考虑HQL方法。你不应该使用这个方法!因为它会加载包含所有字段的所有实体,所以您只能检查
id
。对于新用户,您可以在hibernate中使用jparepository.exists(id)。查看hibenate jpa文档了解更多信息。最后一行不需要条件:可以使用.uniqueResult()!=无效的
public static boolean uniqueExists(Criteria uniqueCriteria) {
    uniqueCriteria.setProjection(Projections.id());
    return uniqueCriteria.uniqueResult() != null;
}