1. 程式人生 > >Spring Cacheable註解不快取null值

Spring Cacheable註解不快取null值

@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