如何使用Hibernate的CriteriaBuilder构建选择计数(*)并按SQL查询分组?

时间:2018-08-13 10:40:06

标签: java hibernate jpa criteria-api

我的存储库类中有以下代码:

Root<Post> fromPost = query.from(Post.class);
Selection<Long> longSelection = criteriaBuilder.count(fromPost).alias("c");
Selection<Object> item = fromPost.get("creatorId").alias("item");
CriteriaQuery<GroupEntry> select = query.multiselect(longSelection, item);
select.groupBy(fromPost.get("creatorId"));
select.orderBy(criteriaBuilder.desc(criteriaBuilder.count(fromPost)));

在这里,我正在尝试使用CriteriaBuilder建立这样的查询:

select count(*), creator_id from post 
group by creator_id
order by count(*) desc

但是,Hibernate不在count(*)count(post.post_id)语句中生成select,而是生成group by。在给定情况下,第一个要比第二个快得多,因为它不使用数据库堆,而仅使用索引-与count(field)不同。

一些其他详细信息:

  • PostgreSQL 9.6
  • 休眠4.3.10
  • 我的Post类如下:

    import javax.persistence.*;   
    
    @Entity
    @Table(name = "post")
    public class Post implements Serializable {
    
    @Id
    @Column(name = "post_id", updatable = false)
    protected String postId;
    
    other fields...
    }
    
  • GroupEntry类包含idcitem列。

0 个答案:

没有答案