Спящий режим: проверьте, существует ли объект
Допустим, в БД хранятся объекты типа 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 в спящий режим ...
Ответ #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 создавать более сложные критерии запроса.
Ответ #2
Ответ на вопрос: Спящий режим: проверьте, существует ли объект
Вы можете использовать session.get
:
public Object get(Class clazz,
Serializable id)
throws HibernateException
Он вернет null, если 9X_hibernate объект не существует в базе данных. Дополнительную 9X_hibernate информацию можно найти в Hibernate API Documentation.
- вам не следует использовать этот метод! Поскольку он загружает всю су ...
Ответ #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;
}
}
- Для последней строки условное выражение не требуется: ...
Ответ #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;
}
-
8
-
3
-
7
-
5
-
9
-
17
-
6
-
4
-
15
-
17
-
9
-
13
-
5
-
8
-
10
-
5
-
12
-
4
-
6
-
11
-
8
-
3
-
5
-
5
-
13
-
5
-
5
-
7
-
5
-
11
-
2
-
5
-
8
-
3
-
8
-
21
-
2
-
5
-
6
-
5
-
4
-
3
-
3
-
5
-
7
-
2
-
13
-
7
-
2
-
2