从休眠状态的实体获取行并进行计数和连接

问题描述 投票:4回答:1

我正在尝试从一个使用休眠连接的表中获取字段名称。有人知道如何获得吗?我在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个回答
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
}
© www.soinside.com 2019 - 2024. All rights reserved.