Спящий режим: проверьте, существует ли объект
Допустим, в БД хранятся объекты типа 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