您需要啓用query caching,並將此特定查詢設置爲緩存功能。這隻能通過提示在JPA 2.0中使用。
query.setHint(「org.hibernate.cacheable」, true);
,並通過設置以下屬性
hibernate.cache.use_query_cache true
另一種解決方案,查詢緩存會在一個循環中使用getReference並啓用批量加載。如果實例存在於緩存中,它將從緩存中返回 - 如果不是,當訪問第一個代理對象時,它將觸發一個查詢來加載一批這些對象。您可以將其隱藏在效用函數後面。
public List<T> findMany(Class<T> entityClass,List<? extends Serializable> ids) {
List<T> result = new ArrayList<T>;
for(Serializable id:ids) {
result.add(entityManager.getRefrence(id));
}
for(T entity:result) {
// force initialization of proxies, if batch loading is enabled
// this shouldn't lead to one query per entity
Hibernate.initialize(entity);
}
return result;
}
這可能需要一些調整 - 沒有測試過 - 尤其是泛型部分。
我不確定這就是全部。我已經啓用了查詢緩存,而且我看到發生的事情是Hibernate將執行查詢:在(ids)中選擇ids,這有點愚蠢......緩存...然後通過ID獲取實體... – user671435
您是否將特定查詢設置爲可緩存?同樣的實體的任何更新/插入都會使緩存失效。 – gkamal
這不是問題。我正在通過ID索取實體。任何緩存的查詢都會包含相同的一組ID。這不是說查詢緩存不工作......這是不必要的,正如你指出的那樣,更新/插入使緩存無效......這是毫無意義的......因爲我仍然通過ID詢問實體。我的工作是重寫StandardQueryCache並讓它返回我傳入的同一組Ids。 – user671435