2013-02-08 52 views
0

我擁有的是一個很大的(如數十萬)ID列表。我想通過JPA查詢從具有此ID的對象中獲取一些值。JPA查詢:什麼是通過大量可能值進行選擇的正確方法?

選項1 - 使用IN子句

List<Long> ids = /* ... */ 
entityManager.createQuery(
     "SELECT v.lat, v.lon FROM Vehicle v WHERE v.id IN (:ids)", 
     Long[].class) 
    .setParameter("ids", ids) 
    .getResultList(); 

恐怕有可能在IN條款內容的限制。

選項2 - 查詢每個ID分別

List<Long> ids = /* ... */ 
for (Long id : ids) { 
    entityManager.createQuery(
      "SELECT v.lat, v.lon FROM Vehicle v WHERE v.id = :id", 
      Long[].class) 
     .setParameter("id", id) 
     .getSingleResult(); 
} 

這看起來太緩慢,因爲似乎做得ids.size()請求。

什麼是做這種類型的事情的正確方法?

想到的
+4

只是一個評論。被警告,'IN(id1,id2,id3,...,idN)'語法可能有限制。例如。在Oracle上,這樣的列表中有1000個人工智能限制。 – 2013-02-08 14:21:25

回答

0

第一件事:

  1. 切在部分地區的ID列表說1000點的ID。一個可管理的大小。
  2. 對每個零件運行IN查詢。
  3. 將結果彙總到列表中。

對於大數據集,通過並行執行(2)可以顯着提高性能。

1

你的兩種方法都沒有太大的價值。正如Grzegorz的評論中所提到的,所有數據庫都會限制您可以使用多少個列表項。此外,您的查詢可以包含多少個字符也有限制。所以列表出來了。

數以十萬計的個人疑問似乎是不明智的(記住發貼準則丹,有禮貌)。

如果這是我的問題,我會先看看如何生成id列表。這可能是一個數據庫查詢。如果是這樣,我會做一個新版本的查詢來獲得lats和lons。它可能是一個表連接,或者它可能是一個子查詢。不知道你的數據庫結構,我不能給你任何詳細的建議。

相關問題