2016-11-08 32 views
0

我有一個數據庫表與ORMlite映射,它包含一些數據(18列),它也包含ForeignCollectionField(eager = true)如何加快海外收藏的急切加載?

問題是加載此表中的所有數據時... ORMlite正在使用連接爲每個項目創建查詢。這導致了67124個查詢並永久加載該表中的所有對象。

然而,這可以在幾秒鐘內的右連接查詢中完成?爲什麼要生成數千個查詢呢?

我該如何加快速度?我必須編寫原始查詢,然後RawRowMapper,這使得使用ORM毫無意義。

如何處理加載ormlite中的渴望集合?因爲queryForAll沒有辦法..

+0

你爲什麼要加載所有的數據,以及如何? ORM不適用於報告或ETL,這是「加載所有數據」的唯一有效理由。使用存儲過程或視圖。你所描述的是'N + 1'問題,應該使用急切加載來解決。你如何進行查詢以及你如何定義映射? –

+0

PS ORM *真的,真的*不適用於報告或ETL。這只是一個學術討論。當*不打算將任何域邏輯應用到它們時,您無法將行和值轉換爲對象。 –

+0

在這種情況下,我需要加載所有數據,這些數據稍後將全部顯示在3D圖形中並用於模擬...背後有大的邏輯域邏輯。這個表有更多的列和整個數據庫有更多的表..但這次我需要加載所有和它的慢..反正即使不會是大領域的邏輯,你在開始加載所有數據,數據庫仍然是一個好方法保存這些數據,因爲它的列可以在運行時更新,而不是重寫整個xml文件。 –

回答

1

問題是從該表中加載所有數據時... ORMlite爲每一個項目創建查詢,而不是使用聯接。這導致了67124個查詢並永久加載該表中的所有對象。

這是ORM_Lite_的原因。很多人要求加入對國外館藏的支持,但我還沒有得到它。這並不容易。

如果你仍然想使用ORMLite,那麼我建議而不是使用eager = true,而不是做2個查詢。一個查詢您的主要項目,然後使用與收集實體關聯的使用IN的DAO的另一個查詢。例如:

qb = accountDao.queryBuilder(); 
qb.where()...; 
List<Account> accounts = qb.query(); 

// build a list of account-ids 
List<Long> accountIds = new ArrayList<>(); 
for (Account account : accounts) { 
    accountIds.add(account.getId()); 
} 

// now use this list of ids to get your other entities 
List<Order> orders = orderDao.queryBuilder().where().in("accountId", accountIds).query(); 
// now you have a list of orders for all of your ids 
// you will need to associate each order with its account 

希望這有助於。