gpt4 book ai didi

java - 构建 JPA Criteria API 查询 - 按集合中的元素数排序

转载 作者:搜寻专家 更新时间:2023-10-31 19:55:29 27 4
gpt4 key购买 nike

我在使用 JPA Criteria API 构建查询时遇到问题。

实体和重要属性:

@Entity
public class Post {
@Id int id;
@OneToMany (mappedBy = "post") Set<Comment> comments;
//...
}

@Entity
public class Comment {
@Id int id;
@ManyToOne Post post;
//...
}

我需要一个查询,它将返回数据库中按评论数量排序的所有帖子(Post 中的OneToMany)。起初我认为这可以用 JPQL 来实现,比如:

SELECT p 
FROM Post p
ORDER BY SIZE(p.comments) DESC

但是 SIZE(...) 函数不能在 JPQL 中使用它来排序。

因此,我找到了关于 JPA Criteria API 的信息,并尝试了以下操作:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Post> cq = cb.createQuery(Post.class);
Root<Post> p = cq.from(Post.class);
cq.select(p);
cq.orderBy(cb.desc(p.get("comments")));
List<Post> resultList = em.createQuery(cq).getResultList();

对于这个查询,我没有得到正确的结果。我知道我缺少获取集合“评论”的 size,但不知道如何添加该部分。我不太熟悉 JPA Criteria API。此查询应该如何让所有帖子按其 comments 字段(集)的大小排序?

最佳答案

CriteriaBuilder.size(Expression)返回 Expression<Integer>您可以在 ORDER BY 子句中使用。这行代码:

p.get("comments")

..返回 Path<X>延伸Expression<X>因此使用返回值作为 Collection.size() 的参数是安全的。

但是,前面引用的代码行使用了 Path.get() 的特定重载版本,这将使编译器无法推断类型参数 X。相反,类型参数将被假定为 Object。 . 但是 Collection.size() 已将其表达式参数声明为“参数化类型”,其“上限”为Collection。 (这在我的回答中对 CriteriaBuilder.size() 的第一次引用中没有准确反射(reflect),StackOverflow 坚持从方法签名中删除类型。请改为查看 JavaDocs!)。所以我们必须明确地提供类型参数。

试试这个:

cq.orderBy(cb.desc(cb.size(p.<Collection>get("comments"))));

关于java - 构建 JPA Criteria API 查询 - 按集合中的元素数排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21005794/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com