Hibernate: как сделать запрос EXISTS? (не подзапрос)


Например:

EXISTS ( SELECT * FROM [table] WHERE ... )

Как сделать такой запрос, используя Hibernate?

5 5

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. Но вы можете использовать несколько подходов:

  1. count(*) > 0 но это плохо для производительности избегайте использования COUNT () в SQL, когда вы могли бы использовать EXISTS ()
  2. Используйте boolean exists = session.createQuery("from PersistentEntity where ...").setMaxResults(1).uniqueResult() != null;, но это заставит Hibernate загрузить все поля и сделать гидратацию объектом, но вам нужно просто проверить значение null.
  3. Используйте session.get(PersistentEntity.class, id) != null, и это будет работать быстрее, если вы включили кэш второго уровня, но это будет проблемой, если вам нужно больше критериев, чем просто id.
  4. вы можете использовать следующий метод: getSession().createQuery("select 1 from DTOAny t where ...").uniqueResult() != null)

Я использовал следующее: SELECT COUNT(e) FROM Entity e. Прекрасно работал в Spring Data JPA .

Попробуйте:

"select count(e) > 0 from Entity e where..."

Прекрасно работает с весенними данными.