当前位置: 首页 > 面试题库 >

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

贺博厚
2023-03-14
问题内容

我在使用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;
    //...
}

我需要一个查询,该查询将返回数据库中按评论数(OneToMany在中Post)排序的所有帖子。起初,我认为可以通过以下方式实现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")

..returns Path<X>扩展Expression<X>为a ,因此可以安全地将返回值用作Collection.size()的参数。

但是,前面引用的代码行使用的是Path.get()的特定重载版本,这将使编译器无法推断类型参数X。而是将type参数假定为Object但是
Collection.size()宣布他的Expression-parameter为带有“上限”的“参数化类型” Collection
这在我的回答中对CriteriaBuilder.size()的首次引用中并未准确反映,StackOverflow坚持擦除方法签名中的类型。请参阅JavaDocs!
)。因此,我们必须显式提供类型参数。

尝试这个:

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


 类似资料:
  • 问题内容: 我正在尝试做一个标准查询,该查询返回像常见问题一样的stackoverflow中回答最多的问题。 一个问题包含多个答案。 我试图以标准查询返回按每个问题的答案数排序的最常回答的问题。 有人知道我应该在hibernate标准util中使用什么吗? 问题答案: 这将返回一个Object []列表。每个Object []都将问题的ID作为第一个元素,并将此问题的答案数目作为第二个元素。问题按

  • 假设有几个数组: 我需要找出所有可能的元素集合(1,2,3,4,5...)中的每一个在至少两个阵列(A,B,C....)并以下列方式显示它们: 实际输入是包含字符串的文件。可能有数千个文件,每个文件可能包含一百多个密钥字符串。 我尝试了下面的方法:首先,我通过比较所有可能的数组对来生成元素集。然后,我试图通过使用逻辑生成其他集合——元素集合的交集在数组集合的并集中很常见。像这样: 从上面我们可以得

  • 问题内容: 每个表(表1和表2)都有其自己的DATETIME字段。 我正在尝试捕获两个表的ID,并按其DATETIME字段对其进行排序。 例子: 我的输出未通过以下查询正确排序: 所需数据: 来自表2 id:2、1, 来自表1 id:3、2、1 因此:2、1、3、2、1 ////编辑 对于可能会遇到冗长而复杂的MySQL请求的人们,请在PhpmyAdmin中尝试一下!它会告诉您错误! ////编辑

  • 如何查询包含至少一个搜索条件元素的? 给定这个对应的数据库模式 对于此实体类 我想在数据库中查询有产品列表的公司。在SQL中我可以做 等效的HQL/JPQL查询是什么样子的? 我找到了Hibernate的集合相关表达式和限定路径表达式,但是我无法创建一个有效的查询。 > 作为命名参数 org . spring framework . Dao . invaliddataaccessapiusagee

  • 问题内容: 我有一个QuerySet,让我们称之为,它是由与该问题无关的某些属性排序的。然后有一个对象,我们称它为。现在,我想尽可能 高效 地知道in中的索引。我知道我可以在Python中使用它,也可以通过将每个对象与进行比较来循环,但是执行此操作的最佳方法是什么?我正在寻找高性能,这是我唯一的标准。 __ 在Windows上将Python 2.6.2与Django 1.0.2结合使用。 问题答案

  • 问题内容: 如本问题所述,您可以在S中使用字符串文字。 例如,这适用于Oracle: order-by可以采用字符串文字,这是联合结果中列的名称。 (分区表中有成千上万的行,我正试图对那些该死的东西进行分页) 但是,当针对SQLite3运行时,这会生成一个异常: 您如何获得a的结果? 问题答案: 联合查询中的查询不能排序。 为了能够在复合查询中使用限制,必须将单个查询包装在单独的子查询中: