我有一个包含以下内容的实体表:
@Entity 公共课邮报{
@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);
}
答案 0 :(得分:0)
在JPQL中,您可以使用名为SIZE的函数来获取ElementCollection大小。
我完全不了解您希望如何查询数据,因此我将在示例实体结构中为您提供两个不同的可能用法示例。
要获得N个最多投票的帖子,我们需要
就像那样:
select p from Post p order by SIZE(p.votesFor) desc limit :n
其中:n 是查询中的某个参数
第二种可能的方法是查询至少有一些&#39; votesFor&#39;的帖子。要做到这一点,你只需要使用WHERE表达式,就像那样:
select p from Post p where SIZE(p.votesFor) >= :n
其中:n是您要寻找的最小票数。
有关SIZE HERE
等特殊运营商的更多信息