假设, A 类型的对象存储在DB中。这是我使用hibernate从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.....
}
无法找到它的hibernate docs ...
答案 0 :(得分:45)
您可以使用 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,您可以创建更复杂的查询标准。
答案 1 :(得分:24)
您可以使用session.get
:
public Object get(Class clazz,
Serializable id)
throws HibernateException
如果数据库中不存在该对象,则返回null。您可以在Hibernate API Documentation中找到更多信息。
答案 2 :(得分:10)
<强>休眠强>
仅获取最佳性能的关键:
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的一个实现,因此可以inject一个EntityManager。此方法也具有良好的性能,因为它lazily fetches实例:
public boolean exists(Class clazz, Object key) {
try {
return entitymanager.getReference(Entity.class, key) != null;
} catch (EntityNotFoundException.class) {
return false;
}
}
答案 3 :(得分:4)
@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;
}