Hibernate: как сделать запрос EXISTS? (не подзапрос) - PullRequest
8 голосов
/ 14 апреля 2011

Например:

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

Как сделать такой запрос с помощью Hibernate?

Ответы [ 6 ]

13 голосов
/ 11 ноября 2016

HQL не позволяет использовать оператор exists. UPD Начиная с Hibernate 5 он поддерживает его как предикат в WHERE

Вы можете использовать несколько подходов:

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

Если вашей целью является проверка некоторого набора пустоты, вы можете использовать простой HQL-запрос:

boolean exists = (Long) session.createQuery("select count(*) from PersistentEntity where ...").uniqueResult() > 0
5 голосов
/ 13 февраля 2015

Если мы используем предложение WHERE, базе данных, возможно, придется сканировать всю таблицу, чтобы подсчитать записи, соответствующие нашим критериям, но мы можем ограничить поиск только одной записи, достаточно сказать о пустоте.

Если бы не было каких-либо поисковых фильтров, предыдущий запрос был бы допустим, поскольку база данных выполняла бы некоторую оптимизацию с использованием индекса.

, поэтому я полагаю, что следующий запрос увеличит производительность по сравнению с предыдущим:

boolean exists = session.createQuery("from PersistentEntity where ...").setMaxResults(1).uniqueResult() != null;
2 голосов
/ 15 ноября 2018

Есть несколько хороших комментариев об использовании EXISTS, но нет примеров. Вот мое решение в Hibernate 5.2:

boolean exists = session.createQuery( 
                    "SELECT 1 FROM PersistentEntity WHERE EXISTS (SELECT 1 FROM PersistentEntity p WHERE ...)")
            .uniqueResult() != null;
0 голосов
/ 24 августа 2016

Попробуйте:

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

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

0 голосов
/ 02 марта 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...