2012-11-13 69 views
1

我用querydsl使用spring數據jpa。我有一個方法返回包含總數的頁面查詢結果。獲得總數是昂貴的,我想緩存它。這怎麼可能?spring-data:緩存查詢總數

我幼稚的做法

@Cacheable("queryCount") 
private long getCount(JPAQuery query){ 
    return query.count(); 
} 

不起作用(使它發揮他們的方式想爲緩存不應該是整個查詢,只是標準的實際鍵)。無論如何測試它,沒有工作,然後我發現這一點:Spring 3.1 @Cacheable - method still executed

我明白這一點,我只能緩存公共接口方法。然而在所述方法中,我需要緩存返回值的屬性,例如。

Page<T> findByComplexProperty(...) 

我需要緩存

page.getTotalElements(); 

詮釋整個方法的工作(這是緩存),但不是我想的方式。假設獲得總計數需要30秒。因此,對於每個新頁面請求用戶需要等待30秒。如果他返回頁面,則使用緩存,但我希望計數只能運行一次,然後從緩存中提取計數。

我該怎麼做?

回答

1

我的解決辦法是在自動裝配類高速緩存管理器創建複雜的查詢:

@Autowired 
private CacheManager cacheManager; 

,然後創建一個簡單的私有方法getCount將

private long getCount(JPAQuery query) { 
    Predicate whereClause = query.getMetadata().getWhere(); 
    String key = whereClause.toString();   
    Cache cache = this.cacheManager.getCache(QUERY_CACHE);   
    Cache.ValueWrapper value = cache.get(key); 
    if (value == null) { 
     Long result = query.count(); 
     cache.put(key, result); 
     return result; 
    } 
    return (Long)value.get(); 
}