使用计数和连接从休眠的实体中获取行

Posted

技术标签:

【中文标题】使用计数和连接从休眠的实体中获取行【英文标题】: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()) 
        ...

但它不起作用。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于使用计数和连接从休眠的实体中获取行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用具有多个连接的 SQL 查询并使用休眠计数

删除后休眠意外行数上升

如何从休眠会话中获取 jdbc 连接? [复制]

使用 JPQL 连接不相关的实体在休眠 5.3.2 中无法在 Spring 数据中工作

休眠:获取太多行

如何配置 Hibernate Envers 以避免实体修订查询中的某些集合(连接表)