Спящий режим: проверьте, существует ли объект

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

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

Если объекта с id = 1 не 9X_hibernate существует, я получу ObjectNotFoundException . Но есть ли способ 9X_hibernate проверить, существует ли такой объект, не 9X_hibernate перехватывая исключение? Я бы хотел что-то 9X_hibernate вроде:

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

Не удалось найти документы для перехода 9X_hibernate в спящий режим ...

30
0
4
Общее количество ответов: 4

Ответ #1

Ответ на вопрос: Спящий режим: проверьте, существует ли объект

вы можете использовать HQL для проверки существования 9X_hibernate объекта:

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

48
0

Ответ #2

Ответ на вопрос: Спящий режим: проверьте, существует ли объект

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

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

Он вернет null, если 9X_hibernate объект не существует в базе данных. Дополнительную 9X_hibernate информацию можно найти в Hibernate API Documentation.

26
2

  • вам не следует использовать этот метод! Поскольку он загружает всю су ...

Ответ #3

Ответ на вопрос: Спящий режим: проверьте, существует ли объект

Гибернация

Получает только ключ для оптимальной производительности:

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

Поскольку 9X_hibernate Hibernate является реализацией JPA, можно 9X_hibernate inject использовать EntityManager. Этот метод 9X_hibernate также имеет хорошую производительность, потому 9X_hibernate что он lazily fetches экземпляр:

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

10
1

  • Для последней строки условное выражение не требуется: ...

Ответ #4

Ответ на вопрос: Спящий режим: проверьте, существует ли объект

Немного упрощенный метод @Journeycorner

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

Также 9X_hibernate может быть полезен способ, описанный ниже. Имейте 9X_hibernate в виду, что этот метод можно использовать 9X_hibernate только с критериями, которые могут создавать 9X_hibernate не более одной записи (например, критерий 9X_hibernate Restrictions.idEq())

public static boolean uniqueExists(Criteria uniqueCriteria) {
    uniqueCriteria.setProjection(Projections.id());
    return uniqueCriteria.uniqueResult() != null;
}

6
0