使用ProjectionList(投影)和DetachedCriteria分页查询部分字段

使用ProjectionList(投影)和DetachedCriteria分页查询部分字段

在Spring中,我们dao层分页查询通常使用的是DetachedCriteria来处理

如下面的代码


List<Article> list = (List<Article>) hibernateTemplate.findByCriteria(criteria, start, Length);
上面的代码,表示查询Article这个实体,从start开始查询Length大小的数据


这段代码查询的是整个Article实体。如果我们需要查询部分字段,可以使用投影来实现

首先我们创建一个DetachedCriteria对象

DetachedCriteria criteria = DetachedCriteria.forClass(Article.class);

DetachedCriteria criteria = DetachedCriteria.forClass(Article.class);
再创建一个投影集合
//设置创建投影集合
ProjectionList proList = Projections.projectionList();
proList.add(Projections.groupProperty("arid"));
proList.add(Projections.groupProperty("artitle"));
proList.add(Projections.groupProperty("ardate"));
proList.add(Projections.groupProperty("arfenlei"));
proList.add(Projections.groupProperty("arcount"));

这里我们创建了一个投影集合

GroupProperty里面的参数是和您实体中的字段名一致的,如上面的代码,我们只需要查询这个实体中的五个字段

接下来我们将这个投影集合加入到DetachedCriteria中去


criteria.setProjection(proList);


然后开始分页查询


List<Object[]> list = (List<Object[]>) hibernateTemplate.findByCriteria(criteria, start, Length);
需要注意的是


1、这个查询,查询出来的是一个Object数组的集合

这个Object数组如下格式{1,"标题",时间,2,10}

就是数组的顺序是根据上面代码中add的顺序排序的

而且,第一个是1,您可以强制类型转换,第三个的一个是时间,您也可以强制类型转换

如以下代码,obj数组是list的其中一个元素 


Object[] obj = list.get(0);
Date d = (Date) obj[2];
2,后面的查询三个参数,不难理解吧


第一个是DetachedCriteria 对象,第二个是查询的开始位置,第三个是查询多少条数据


如此,我们就使用DetachedCriteria 和 ProjectionList技术实现了查询部分字段的分页功能


爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情Blog Img