当前位置:  开发笔记 > 编程语言 > 正文

Hibernate:检查对象是否存在

如何解决《Hibernate:检查对象是否存在》经验,为你挑选了3个好方法。

假设,类型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 ...



1> ArBR..:

您可以使用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,您可以创建更复杂的查询标准.



2> Juanma..:

你可以使用session.get:

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

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


得到工作,但这是一个缓慢的方法,因为Hibernate必须获取所有列并将它们影响到新对象并将其存储在会话中.如果您不想无用地浪费资源,请考虑使用HQL方法.
你不应该使用这种方法!因为它加载所有字段的所有实体,而只能检查`id`.

3> Journeycorne..:

过冬

仅获取最佳性能的关键:

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;
   }
}


你不需要最后一行的条件:你可以使用.uniqueResult()!= null;
推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有