Hibernate: как сделать запрос EXISTS? (не подзапрос)
Например:
EXISTS ( SELECT * FROM [table] WHERE ... )
Как сделать такой запрос, используя Hibernate?
5 ответов:
Если ваша цель-проверить некоторый набор на пустоту, вы можете использовать простой запрос HQL:
boolean exists = (Long) session.createQuery("select count(*) from PersistentEntity where ...").uniqueResult() > 0
Если мы используем предложение WHERE, база данных может сканировать всю таблицу для подсчета записей, соответствующих нашим критериям, но мы можем ограничиться поиском только одной записи, достаточно сказать о пустоте.
Если бы не было фильтров поиска, предыдущий запрос был бы допустим, так как база данных выполняла бы некоторую оптимизацию с использованием индекса.
Поэтому я предполагаю, что следующий запрос увеличит некоторую производительность по сравнению с предыдущим:
boolean exists = session.createQuery("from PersistentEntity where ...").setMaxResults(1).uniqueResult() != null;
HQL не позволяет использовать оператор
exists
. Но вы можете использовать несколько подходов:
count(*) > 0
но это плохо для производительности избегайте использования COUNT () в SQL, когда вы могли бы использовать EXISTS ()- Используйте
boolean exists = session.createQuery("from PersistentEntity where ...").setMaxResults(1).uniqueResult() != null;
, но это заставит Hibernate загрузить все поля и сделать гидратацию объектом, но вам нужно просто проверить значение null.- Используйте
session.get(PersistentEntity.class, id) != null
, и это будет работать быстрее, если вы включили кэш второго уровня, но это будет проблемой, если вам нужно больше критериев, чем простоid
.- вы можете использовать следующий метод:
getSession().createQuery("select 1 from DTOAny t where ...").uniqueResult() != null)
Я использовал следующее:
SELECT COUNT(e) FROM Entity e
. Прекрасно работал в Spring Data JPA .