2011-10-14 33 views
1

我有一個簡單的長主鍵的實體。 我做了一個查詢,如:從表中選擇primary_key IN(....);休眠通過主鍵查找列表直接到L2高速緩存

Hibernate似乎想要做一個查詢來獲取Ids(我剛剛指定的!),然後進入L2緩存。有什麼辦法可以跳過最初的查詢嗎?我只想通過主鍵獲得一組實體。 不確定這是JPA 1還是JPA 2.0(它更好地支持列表)。

我可以在一個循環中執行findById()並獲得所需的結果,但這顯然不是最優的。

回答

0

您需要啓用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;  
} 

這可能需要一些調整 - 沒有測試過 - 尤其是泛型部分。

+0

我不確定這就是全部。我已經啓用了查詢緩存,而且我看到發生的事情是Hibernate將執行查詢:在(ids)中選擇ids,這有點愚蠢......緩存...然後通過ID獲取實體... – user671435

+0

您是否將特定查詢設置爲可緩存?同樣的實體的任何更新/插入都會使緩存失效。 – gkamal

+0

這不是問題。我正在通過ID索取實體。任何緩存的查詢都會包含相同的一組ID。這不是說查詢緩存不工作......這是不必要的,正如你指出的那樣,更新/插入使緩存無效......這是毫無意義的......因爲我仍然通過ID詢問實體。我的工作是重寫StandardQueryCache並讓它返回我傳入的同一組Ids。 – user671435