2015-05-30 23 views
0

是否有Java庫允許我針對基本Java集合執行JPQL查詢,從而將集合有效地視爲內存數據庫?對內存中的集合運行JPQL查詢

我目前正在爲每個查詢變體編寫自定義代碼,這很容易出錯並且很難維護。由於需要與其他代碼進行互操作,因此我無法從集合切換到真正的內存數據庫,如HSQLDB。

我可以想到兩種解決方法。因爲這些集合是暫時的並且經常並行處理,所以這些解決方法看起來像會增加太多開銷(但是隨時可以說服我)。它們是:

  1. 每次我需要進行鍼對集合JPQL查詢,站了一個臨時的內存數據庫,從集合填充它,並運行對數據庫查詢。 - 我相信這會引入的開銷並不是我正試圖解決的問題。
  2. 像#1一樣,但是要保持內存數據庫以減少開銷。 - 集合的瞬時性意味着如果我爲每個集合保留一個數據庫,這並不比#1好。這些查詢的並行特性使得在不同的集合查詢中重複使用相同的內存數據庫實例是不平凡的。

編輯:

這裏是確切的使用情況:

我們使用Drools的,因爲它在我們的服務器上進行更改,以對數據進行驗證。我們的驗證規則需要將大量支持數據加載到知識會話中。

爲了簡單起見,我們在每次需要時都嘗試建立知識會話,這樣我們就不必擔心陳舊的數據,但是這樣的時間表現是不可接受的。

我們現在正在切換到與數據庫保持同步的知識會話。知識會話最初是在第一次訪問時填充的。 JPA回調監聽器將實體添加記錄到集合中,並且如果它們適用於,則這些實體在下一個機會中被併入知識會話中。

這裏的摺痕是設計必須允許在生產系統的後期對規則進行修改和添加;規則更改可能會更改驗證所需的數據,因此數據加載機制必須同樣靈活。

從我們的第一次嘗試中,我們已經有了一種機制,規則通過JPQL語句定義應該加載哪些數據,並執行這些JPQL語句以最初填充知識會話。

我現在利用這些相同的JPQL語句來確定哪些來自JPA回調監聽器的實體應該添加到知識會話中。爲此,我正在編寫代碼來解釋此JPQL,並將where子句過濾器應用於來自JPA回調監聽器的實體。我寧願使用第三方庫來爲我做這件事。

如果您認爲我們應該以完全不同的方式處理此問題,請隨時提出更改建議。設計很複雜,但不幸的是,其中大部分都是由客戶需求驅動的,無法避免。

+1

我永遠不會想到使用任何這些方法。如果您使用Java 8,那麼在創建*查詢*時,使用流api將非常有效且不易出錯。儘管如此,提供你想要/需要的樣本可以幫助我們提供更好的替代方案來解決這個問題。 –

+0

我不確定這個的目的。如果測試,然後使用DBUnit和一些內存數據庫,它應該足夠快速和高效,而不會影響生產代碼。如果它沒有測試,請詳細解釋一下用例... –

+0

這是你想問的問題嗎? http://stackoverflow.com/questions/1217228/what-is-the-java-equivalent-for-linq – MarkOfHall

回答

0

如果您想嘗試DataNucleus將JPA做這種性質的東西,你需要得到他們的內部查詢類,我認爲,事情的保持像

Query q = em.createQuery(...) 
org.datanucleus.store.query.Query dnq = ((org.datanucleus.api.jpa.JPAQuery)q).getInternalQuery(); 
dnq.setCandidates(myCollectionOfCandidates); 
... 
List results = q.getResultList(); 

您可能還需要

q.setHint("datanucleus.query.evaluateInMemory","true"); 

我只使用過候選集合的JDO API,但應該可以工作。