2011-04-13 197 views

回答

12

如果你的目標是檢查在空虛的一些設置,你可以使用簡單的HQL查詢:

boolean exists = (Long) session.createQuery("select count(*) from PersistentEntity where ...").uniqueResult() > 0 
+5

不使用'COUNT(*)'的存在檢查,因爲所有的聚集查詢是不好的性能 https://blog.jooq.org/2016/ 09/14/avoid-using-count-in-sql-when-you-could-use-exists/ – stokito 2016-11-11 18:30:11

+0

哦,那很好。繼續,先生。你在這個答案的五年後,在09.2016指向博客,不喜歡它。 MKEY。 – 2016-11-12 16:59:02

+2

stokito是對的。遲到總比不到好。 – KidA424 2017-02-03 20:24:52

4

如果我們使用WHERE子句,數據庫可能不得不掃描整個表來計算記錄符合我們的標準,但我們可以限制只搜索一條記錄,這足以說明空虛。

如果沒有任何搜索過濾器,那麼之前的查詢將被允許,因爲數據庫將使用索引進行一些優化。

,所以我想下面的查詢將增加一些性能比較比較前一個:

boolean exists = session.createQuery("from PersistentEntity where ...").setMaxResults(1).uniqueResult() != null; 
0

我用下面的:SELECT COUNT(e) FROM Entity e。在Spring Data JPA工作得很好。

+0

我得到一個'java.lang.ClassCastException:java.lang.Long不能轉換爲java.lang.Boolean'使用Spring Data查詢。你能展示一個完整的工作例子嗎? – 2015-05-22 08:32:50

-1

嘗試:

與Spring數據
"select count(e) > 0 from Entity e where..." 

工作正常。

0

HQL不允許使用exists聲明。但是你可以用幾種方法:

  1. count(*) > 0但是這是不好的性能Avoid Using COUNT() in SQL When You Could Use 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)
+0

爲什麼downvotes?對我來說似乎是一個很好的總結。 – Cookalino 2018-02-09 10:22:06