今天做一个功能,需要把博客按年份进行归档,年份需要使用倒序。
我的思路是,先查出所有的年份,并且直接倒序。然后查询出每一个年份下的所有博客,把这些博客加到一个list中,也就是一个年份有一个list。然后年份做key,list做value,把所有的博客保存到Map中。然后在渲染到前端页面就好了。
查表语句
// 获取到倒序排序的年份list集合 // select date_format(b.update_time,'%Y') as year from t_blog b group by year order by year desc; @Query("select function('date_format',b.updateTime,'%Y') as year from Blog b group by function('date_format',b.updateTime,'%Y') order by year desc") List<String> findGroupYear(); // 根据年份查询出所有博客 // select * from t_blog b where date_format(b.update_time, '%Y') = '2020' order by b.updateTime desc"; @Query("select b from Blog b where function('date_format',b.updateTime,'%Y') = ?1 order by b.updateTime desc") List<Blog> findByYear(String year); // 归档,同一年的存放到一个list中,list存放在map中,年份是key,list是value @Override public Map<String, List<Blog>> archiveBlog() { List<String> years = blogRepository.findGroupYear();// 获取到倒序排序的年份list集合,大到小 Map<String, List<Blog>> map = new HashMap<>(); for(String year : years){ map.put(year, blogRepository.findByYear(year));// 根据年份查询出所有博客,并加入map中 } return map; }理想很丰满,但是实际的效果有偏差。年份并没有倒序,而是相反的顺序。
看到是相反的顺序,我刚开始一直以为是查询语句有问题,但是我检查了好多遍都没有发现问题。我还把查表语句翻译成了SQL语句,在MySQL上跑了一遍,没发年份的顺序现有问题。
然后我加了一句输出,发现年份真的没有问题。
@Override public Map<String, List<Blog>> archiveBlog() { List<String> years = blogRepository.findGroupYear();// 获取到倒序排序的年份list集合,大到小 Map<String, List<Blog>> map = new HashMap<>(); for(String year : years){ System.out.println("年份年份==" + year); map.put(year, blogRepository.findByYear(year));// 根据年份查询出所有博客,并加入map中 } return map; }然后我觉得看到是输出的下一句出了问题。
果不其然,我使用的是HashMap,这是无序的,所以正确顺序的年份存进去,很难保证顺序不会改变。
想要有顺序的Map,可以使用LinkedHashMap。我改回LinkedHashMap之后,终于正常显示了。
基础知识真的很重要,还是好好复习吧。
下面引用一下“Eve2019”博主的对比,大家一起复习一下。