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 面试