Spring Cacheable註解不快取null值
阿新 • • 發佈:2019-01-11
@SuppressWarnings("unchecked") @Cacheable(value = "people", key="#person.id",condition = "#p0.id.equals(\"1\")")//操作成功 進行快取 public ResultBean<Person> cacheCondition(Person person) { System.out.println("讀取資料庫"+person.getId()); return new ResultBean<Person>(person).success(); } //map的value為“”或者null時不快取 /** * Property or field 'value' cannot be found on object of type 'java.util.HashMap' - maybe not public *作者 : iechenyb<br> *方法描述: 說點啥<br> *建立時間: 2017年7月15日hj12 *@param isNull *@return *#result.value == null or #result.value == \"\" 報異常,無value屬性 *可以在result上新增一個標記 表示當data=null或者data=""的狀態 然後根據狀態值進行 ||與or都行 */ @Cacheable(value = "people",unless = "#result.get(\"value\") == null || #result.get(\"value\") == \"\" || #result.get(\"value\").size()==0")//操作成功 進行快取 public Map<String,Object> cacheMapCondition(String isNull) {//****** Map<String,Object> data = new HashMap<String,Object>(); if("1".equals(isNull)){ data.put("value", null); }else if("2".equals(isNull)){ data.put("value", ""); }else if("3".equals(isNull)){ data.put("value", new ArrayList<>());//成功快取 }else if("4".equals(isNull)){ data.put("value", new LinkedHashMap<>());//成功快取 }else{ data.put("value", "chenyb");//沒有size方法 報錯 一般情況下 是知道方法的型別的!!! } System.out.println("如果不為空,則快取,否則每次都查詢資料庫!"); return data; } //unless 滿足的條件是 不快取 @Cacheable(value = "people",unless = "#result.cacheable == false")//操作成功 進行快取******* public ResultBean<String> cacheRSBeanCondition(String isNull) { ResultBean<String> data = new ResultBean<>(); if("1".equals(isNull)){ data.data(null); data.cacheable(false); }else if("2".equals(isNull)){ data.data(""); data.cacheable(false); }else{ data.data("chenyb"); data.cacheable(); } System.out.println("如果不為空,則快取,否則每次都查詢資料庫!"); return data; }
ps:此處需要注意返回值為list集合等等的話,如果需要判斷當且僅當返回的集合不為空的時候才快取到redis等第三方快取中去的話,需要判斷result不等於null且result的size大於0的時候才滿足條件。因為spring+mybatis實測
直接從mapper返回的list是一個沒有內容、size為0的物件,也就是[],不為null