2017-03-15 40 views
1

我有一個查詢來查找數據庫中是否存在一個值。我將它用於在將資源插入數據庫之前對其進行驗證。 它看起來像這樣:如何在JPQL中找到第一個

@NamedQuery(name = "findByName", query = "SELECT g FROM Group g where g.value= :value") 

和數據訪問的實現方式如下:

final TypedQuery<Group> query = entityManager.createNamedQuery("findByName", Group.class); 
    query.setParameter("value", value); 
    return !query.getResultList().isEmpty(); 

它的工作,並沒有工作,但我認爲query.getResultList()的isEmpty。 ()不是我需要的正確語法,而且我正在尋找使其更快,並且一旦找到值就返回,而不是循環遍歷數據庫上的每一行。 任何建議將不勝感激。

+0

你有沒有想過算什麼? ** [春季數據JPA和存在查詢](http://stackoverflow.com/questions/30392129/spring-data-jpa-and-exists-query)** – Karolis

+0

你有沒有想過COUNT? ** [解決方案](http://stackoverflow.com/questions/30392129/spring-data-jpa-and-exists-query?answertab=active#tab-top)** – Karolis

+0

不幸的是春天不是我們去的選擇另一種方法。現在做一個COUNT明顯改善了一點。不過,我仍然不確定這個查詢的query.getResultList()。歡呼聲 –

回答

1

什麼結果的最大數量:

@NamedQuery(name = "existsByName", query = "SELECT CASE WHEN COUNT(g) > 0 THEN true ELSE false END FROM Group g where g.value= :value") 

boolean exists = entityManager.createNamedQuery("existsByName",Boolean.class).setParameter("value",value).getSingleResult(); 
+0

有趣的是,這看起來也很乾淨。非常感謝你。 –

0

也許你可以看看使用pagination來提高速度。

query.setMaxResults(1).getResultList()setFirstResult()

1

你有兩個選擇:

  • 使用COUNT功能:

    @NamedQuery(name = "findByName", query = "SELECT COUNT(g) FROM Group g where g.value= :value") 
    

    這消除了處罰創建實際的實體(加上預先加載等)

  • 使用TypedQuery.setMaxResults()設置檢索到1

    query.setMaxResults(1); 
    
相關問題