如何使用 Hibernate 获得 @ElementCollection 的总和?

Posted

技术标签:

【中文标题】如何使用 Hibernate 获得 @ElementCollection 的总和?【英文标题】:How to get sum of @ElementCollection with Hibernate? 【发布时间】:2018-10-07 09:29:12 【问题描述】:

我有一个包含以下内容的实体表:

@实体 公共类帖子

@Id
@GeneratedValue
private Long id;

@NotBlank
@Size(min = 1, max = 2014)
private String text;

@NotNull
@Temporal(TemporalType.TIMESTAMP)
private Date created;

@NotNull
@ManyToOne
private User author;

@ElementCollection(fetch = FetchType.EAGER)
private Set<String> votesFor;

@ElementCollection(fetch = FetchType.EAGER)
private Set<String> againstFor;

@OneToMany(mappedBy = "post", cascade = CascadeType.REMOVE)
private List<Comment> comments;

public Post() 
    votesFor = new HashSet<>();
    againstFor = new HashSet<>();
    comments = new ArrayList<>();

我想创建一个 TypedQuery,我可以在其中获得投票最多的帖子。 我通过以下代码在@ElementCollection 中添加投票。

我如何对@ElementCollection 求和,然后返回一个列表,其中包含在开始时具有最高票数的帖子并以较少票数停止?

public void votesFor(String userId, long postId) 

    Post post = em.find(Post.class, postId);
    if(post == null) 
        throw new IllegalArgumentException("Post not exists: " + postId);
    

    if(post.getVotesFor().contains(userId)) 
        throw new IllegalArgumentException("User " + userId + " have already voted");
    

    post.getVotesFor().add(userId);
    post.getAgainstFor().remove(userId);

【问题讨论】:

不清楚你在问什么。 【参考方案1】:

在 JPQL 中,您可以使用名为 SIZE 的函数来获取 ElementCollection 的大小。

我完全不明白您究竟想如何查询您的数据,所以我将在您的示例实体结构中为您提供两个不同的可能用法示例。

获得 N 个投票最多的帖子

要获得 N 个投票最多的帖子,我们需要

    votesFor 集合的大小对我们的帖子进行排序。 以 N 为限。

就这样:

select p from Post p order by SIZE(p.votesFor) desc limit :n

:n 是查询中的某个参数

获得至少有 N 个投票的帖子

第二种可能的方法是查询至少有一定数量“votesFor”的帖子。为此,您只需要使用 WHERE 表达式,就像这样:

select p from Post p where SIZE(p.votesFor) >= :n

其中 :n 是您正在寻找的最小票数。

详细了解特殊运算符,例如 SIZE HERE

【讨论】:

谢谢!它对我帮助很大:) 没问题,愉快的编码:)

以上是关于如何使用 Hibernate 获得 @ElementCollection 的总和?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过Hibernate即时获取更新的对象?

(hibernate)如果我想查询表的总记录数,HQL语句应该怎么写?又如何获得值呢?

如何在使用 Hibernate 映射的类中实现 toString()?

Hibernate + Jersey + Jackson 随机获得“org.hibernate.TransactionException:不支持嵌套事务”

如何在使用 Hibernate 保存数据之前检查特殊条件

配置NHibernate hibernate.cfg.xml文件以获得更多连接字符串