首先,抱歉,如果我問的是明顯的問題,或者問題本質上是愚蠢的。JPA只創建查詢一次
更多的學術問題需要知道我是否可以創建一個跨越或獨立於EntityManager
的JPA查詢(命名或其他)。基本上,準備一次運行總是。我明白,我們只能從enitity管理器對象的createXXXQuery
方法中獲得一個Query實例,但是,還有其他方法嗎?
這就是我要做的,
public class MyRepo {
@PersistenceContext
private EntityManager em;
private Query aQueryIntentedtoBePreparedOnlyOnce;
@PostConstruct
public void prepareMyQuery(){
aQueryIntentedtoBePreparedOnlyOnce = em.createQuery("...."); // Query with positional params
}
public void executeMyQuery(){
aQueryIntentedtoBePreparedOnlyOnce.getResultList();
}
}
這完全執行的第一次。但是,它第二次顯示「Entity Manager已關閉」。我明白這是因爲EM是Transaction的範圍。
這個EM是容器管理的(JTA - Spring),所以我不能在事務中擴展它。而且,使用會話bean不是一個選項。那麼,有沒有辦法只創建一次這個查詢?
PS:在哪裏命名查詢和查詢緩存來了?與命名查詢我似乎仍然每次都做createNamedQuery
。什麼是查詢緩存計劃有沒有好的文檔呢?
另一個問題,爲什麼查詢只在EM或連接(JDBC)上創建?爲了準備查詢,我不需要知道我正在與哪個數據庫交談?如果沒有適當的連接,人們永遠無法執行一個?
你不能。使用普通的hibernate,你可以使用'DetachedCriteria',但最終仍然需要成爲一個Criteria實例來執行,因此你仍然需要一個Session(或者JPA稱爲EntityManager)。但是,你爲什麼要這樣做?你不會獲得任何/很多的性能(它只會使用更多的內存),並且實際的查詢(如果已配置)由JDBC驅動程序緩存。 –
@M。 Deinum我不必這樣做,只是想知道我是否錯過了一些東西。爲什麼它會消耗更多的內存?導致查詢是我的回購對象的成員? SQL不會隨參數改變什麼用途是JDBC驅動器緩存的SQL? – anchreg
不可以。因爲'PreparedStatement'不是被綁定參數的查詢緩存的。你在內存中有更多的對象,因此更多的內存。現在你有一個非常短暫的對象,它很快就從內存中移除了。 –