如何使用 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)如果我想查询表的总记录数,HQL语句应该怎么写?又如何获得值呢?
如何在使用 Hibernate 映射的类中实现 toString()?
Hibernate + Jersey + Jackson 随机获得“org.hibernate.TransactionException:不支持嵌套事务”