【问题标题】:Get row from entity on hibernate with count and join使用计数和连接从休眠的实体中获取行
【发布时间】:2020-06-07 01:05:26
【问题描述】:

我正在尝试从一个使用休眠连接的表中获取字段名称。有人知道如何得到它吗?我正在使用带有 EntityManager 的 spring boot。查询是:

"SELECT COUNT(post_id), t.name" +
" FROM TagsPosts tp" +
" JOIN Tags t" +
" WHERE t.id = tp.tags_id" +
" GROUP BY tags_id" +
" ORDER BY 1 DESC"

我试过这个代码

        Query query = entityManager.createQuery(
                "SELECT COUNT(post_id), t.name" +
                " FROM TagsPosts tp" +
                " JOIN Tags t" +
                " WHERE t.id = tp.tags_id" +
                " GROUP BY tags_id" +
                " ORDER BY 1 DESC");
        query.setMaxResults(10);
        for (Object queryResult: query.getResultList()) {
        ...

但它不起作用。

【问题讨论】:

    标签: hibernate join entitymanager criteriaquery


    【解决方案1】:

    这取决于您映射到的 java 对象的方式。在 JPQL 中,您必须引用 java 对象字段名称而不是实际的数据库列名称。假设您有以下映射:

    @Entity
    @Table(name= "Tag")
    public class Tag {
    
        @Column(name="name")
        private String name;
    
        @OneToMany / @ManyToMany
        private List<Post> posts;
    }
    
    @Entity
    @Table(name= "Post")
    public class Post {
    
    
    }
    

    JPQL 是:

    select tag.name , count(post)
    from Tag tag
    join tag.posts post
    group by tag
    order by count(post) 
    

    返回的对象是一个Object[],其中第0个索引是标签名称,而第1个索引是带有此标签名称的帖子数。

    TypedQuery<Object[]> query = entityManager.createQuery(queryStr, Object[].class)    
    query.setMaxResults(10);
    for (Object[] queryResult: query.getResultList()) {
            //queryResult[0] is tag.name 
            //queryResult[1] is total count of the post for this tag
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-12
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      • 2011-02-03
      • 2012-05-11
      相关资源
      最近更新 更多