Hibernate: проверьте, существует ли объект - PullRequest
25 голосов
/ 21 октября 2008

Предположим, объекты типа A хранятся в БД. Вот как я загружаю определенный файл из БД с помощью hibernate:

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 ]

45 голосов
/ 23 июля 2011

вы можете использовать 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 () метод возвращает ноль, если данные не были найдены. Используя HQL, вы можете создать более сложный критерий запроса.

24 голосов
/ 21 октября 2008

Вы можете использовать session.get:

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

Возвращает ноль, если объект не существует в базе данных. Вы можете найти больше информации в Документация по Hibernate API .

10 голосов
/ 02 июня 2015

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;
   }
}
4 голосов
/ 23 февраля 2017

Немного упрощенный метод @ 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...