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);    }  }}

文章以纯面试的角度去解说,所以有很多的细节是未铺垫的。

比如说反射和泛型根底,这些在【Java3y】都有过具体的根本教程甚至电子书,我就不再详述了。

欢送关注我的微信公众号【面试造火箭】来聊聊Java面试