public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> { List<T> findAll(); List<T> findAll(Sort sort); List<T> findAllById(Iterable<ID> ids); <S extends T> List<S> saveAll(Iterable<S> entities); void flush(); <S extends T> S saveAndFlush(S entity); void deleteInBatch(Iterable<T> entities); void deleteAllInBatch(); T getOne(ID id); @Override <S extends T> List<S> findAll(Example<S> example); @Override <S extends T> List<S> findAll(Example<S> example, Sort sort); }
// 傳入 須要group by 和 sum 的字段名 public cacheMap(List<String> groupByKeys, List<String> sumValues) { this.groupByKeys = groupByKeys; this.sumValues = sumValues; } private void excute(T e) { // 從pojo 取出須要group by 的字段 list List<Object> key = buildPrimaryKey(e); // primaryMap 是存儲結果的Map T value = primaryMap.get(key); // 若是從存儲結果找到有相應記錄 if (value != null) { for (String elem : sumValues) { // 反射獲取對應的字段,作累加處理 Field field = getDeclaredField(elem, e); if (field.get(e) instanceof Integer) { field.set(value, (Integer) field.get(e) + (Integer) field.get(value)); } else if (field.get(e) instanceof Long) { field.set(value, (Long) field.get(e) + (Long) field.get(value)); } else { throw new RuntimeException("類型異常,請處理異常"); } } // 處理時間記錄 Field field = getDeclaredField("updated", value); if (null != field) { field.set(value, DateTimeUtils.getCurrentTime()); } } else { // group by 字段 第一次進來 try { primaryMap.put(key, Tclone(e)); createdMap.put(key, DateTimeUtils.getCurrentTime()); }catch (Exception ex) { log.info("first put value error {}" , e); } } }
文章以純面試的角度去講解,因此有不少的細節是未鋪墊的。java
好比說反射和泛型基礎,這些在【Java3y】都有過詳細的基本教程甚至電子書,我就再也不詳述了。面試
歡迎關注個人微信公衆號【面試造火箭】來聊聊Java面試微信