2010-11-23 59 views
1

我的數據庫模型如下:使用參數過濾CayenneDataObject getXXXArray()條目?

A.id (1 : n) B.ad_id 

所以在卡宴的對象A a我可以做a.getBArray()返回我所有B中的條目從這個給定的一個項目。然而,我想根據酒店active = 1對此列表進行過濾。

顯然我可以使用Expression.fromString("active = 1")SelectQuery,但是對於這種方法,我無法找到如何將A實例關聯到我想要在其上運行此查詢的方式。

不同的方法是檢索a.getBArray()中的所有條目,並在代碼中篩選僅搜索那些具有active == true的條目,這種方法是IMHO低效的。

建議大多讚賞。

謝謝, Maxim。

- 編輯:

我目前的解決方案是(對象名稱已分別替換爲& B):

long aId = DataObjectUtils.longPKForObject(db_a_instance); 
String bSQL = "select * from b where active = 1 and a_id = " + aId; 
SQLTemplate bQuery = new SQLTemplate(B.class, bSQL); 
List<B> dbBs = context.performQuery(bQuery); 

,我問,如果有一個更好,更高貴解?

謝謝。

回答

2

我已經在Cayenne的友好郵件列表上提問類似的問題。你可以see here

它似乎是首選的方法是通過關係和Java過濾,除非關係返回非常大的數據。這樣做的好處是,完整列表將在內存中,並且下次使用關係時,您無需前往數據庫。

答案就在這裏

援引這都需要去一趟DB。

  1. (遍歷關係方法)需要一次訪問數據庫從數據庫錯誤組,然後它將在內存中。

  2. (使用篩選器方式進行查詢)需要每次訪問數據庫,因此即使返回的匹配數較少,長時間運行也可能較慢。

如果是這種東西,只發生一次,你真的關心 有關性能(也可能是有團體的很多),我會 去與#2,#否則1。您也可以優化#1,因此您不必每次都重複檢查。

via:Michael Gentry