2009-06-10 146 views
1

好的。我想要的是: 使用Hibernate,加載一次MyEntity對象列表,並將該列表作爲jtable模型的內部數據。我也有一個jTextField,當鍵入一個鍵時,我調用我的模型的一個方法,它將jtextfield的文本作爲參數,並過濾MyEntitys的內部列表並觸發tablemodel更改事件。我想要做這個過濾而不必每次都敲擊數據庫。在內存中過濾不休眠的收集與休眠

我所做的是: 我在模型中保留了2個列表:一個名爲initialList,只有一次使用createCriteria(...).list()加載,第二個列表名爲filteredList,只要刷新方法被稱爲它是這樣填充:

public void refresh(String filterText) 
{ 
    filteredList = session.createFilter(initialList, "where property= ?") 
    .setParameter(0, filterText) 
    .list(); 
} 

然後,我用這個過濾列表給jtable的行,列值。 嗯,它沒有工作,因爲Hibernate說過濾器API的東西只能用於持久集合。所以,我有以下3個問題:

  1. Essentialy如果我創建一個虛擬父實體將包含所有myEntity所行作爲子集並加載該父虛擬實體(在數據庫中的虛擬父表一起) ,這將工作?如果是的話,這聽起來很愚蠢,只是爲了讓hibernate考慮集合的持久性,並讓我使用過濾器的東西。我錯過了什麼?
  2. 假設我確實擁有一個持久集合並使用了過濾器API,這是否保證除了初始加載之外,我不會碰到數據庫?我不在乎被更新,只加載一次,然後快速過濾,因爲我需要過濾每次用戶按下一個鍵。
  3. 是否有任何其他方式來獲得此功能。我想我可以手動使用Java Collections API來對過濾器索引和東西進行排序,但是可以使用其他任何現成的方法?

在此先感謝。

回答

1

不知道關於#1,但它可能工作...

我會建議在尋找可能的commons-集合(CollectionsUtils),並做過濾在內存中,因爲你需要

還取決於查詢如果配置正確,二級緩存實際上可能會阻止對數據庫的訪問。