Hibernate: проверьте, существует ли объект
Предположим, что объекты типа A хранятся в БД. Здесь, как я загружаю определенный из базы данных с помощью hibernate:
org.hibernate.Session session = ...;
long id = 1;
A obj = session.load(A.class, id);
Если объект с id = 1 не существует, я получу ObjectNotFoundException. Но есть ли способ проверить, существует ли такой объект, не вылавливая исключение? То, что я хотел бы иметь, это smth like:
org.hibernate.Session session = ...;
long id = 1;
boolean exists = session.exists(A.class, id);
if(exists){
// do smth.....
}
Не удалось найти hibernate docs...
Ответы
Ответ 1
Вы можете использовать session.get
:
public Object get(Class clazz,
Serializable id)
throws HibernateException
Он вернет значение null, если объект не существует в базе данных. Вы можете найти дополнительную информацию в Документация API Hibernate.
Ответ 2
вы можете использовать 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);
}
Спящий режим метод uniqueResult() возвращает значение null, если данные не найдены. Используя HQL, вы можете создать более сложный критерий запроса.
Ответ 3
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
Немного упрощенный метод @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;
}