29

假设类型A的对象存储在 DB 中。这是我使用休眠从数据库加载特定的方式:

org.hibernate.Session session = ...;
long id = 1;
A obj = session.load(A.class, id);

如果 id=1 的对象不存在,我将得到ObjectNotFoundException。但是有没有办法检查这样的对象是否存在而不必捕获异常?我想要的是:

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

找不到它休眠文档...

4

4 回答 4

47

您可以使用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);
}

如果没有找到数据,Hibernates uniqueResult()方法返回 null。通过使用 HQL,您可以创建更复杂的查询标准。

于 2011-07-22T21:16:42.287 回答
25

您可以使用session.get

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

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

于 2008-10-21T11:34:18.450 回答
11

休眠

仅获取键以获得最佳性能:

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;
   }
}
于 2015-06-02T13:59:26.943 回答
5

@Journeycorner 的一点简化方法

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

下面的方法也很有用。请记住,此方法只能用于生成不超过一条记录的条件(如Restrictions.idEq()条件)

public static boolean uniqueExists(Criteria uniqueCriteria) {
    uniqueCriteria.setProjection(Projections.id());
    return uniqueCriteria.uniqueResult() != null;
}
于 2017-02-23T00:20:11.353 回答