gpt4 book ai didi

java - 如何创建 JPA 查询以按远程引用数量的降序返回对象?

转载 作者:行者123 更新时间:2023-11-30 09:50:19 24 4
gpt4 key购买 nike

我有一个从 Category.comparisons 到 Comparison.category 的 @OneToMany 关系(以及另一个方向的 @ManyToOne 关系)。

我的比较对象有一个“日期”字段,我的类别对象有一个 boolean “安全”字段。

我想检索在我传递给查询的日期之后比较次数最多的 10 个类别对象,并且 Category.safe 为 true。

这是我的最大努力,但根本不起作用:

SELECT c FROM Category c JOIN Category.comparisons 
WHERE c.safe = true AND c.comparisons.date > :afterDate
ORDER BY COUNT(Category.comparisons) DESC

我可以在 native MySQL 中轻松地做到这一点,但我很难理解 JPA 如何处理外键引用,以及 SQL 和 JPA 查询语言之间语法的各种其他差异。

我如何做我想做的事?

最佳答案

在 ORDER BY 子句中使用 size() 函数并更正 JOIN 以使用先前定义的别名 c(对于类别)并为其提供另一个别名 co。在 WHERE 子句中使用该别名:

SELECT c FROM Category c JOIN c.comparisons co
WHERE c.safe = true AND co.date > :afterDate
ORDER BY size(c.comparisons) DESC

但是请注意,这将为您提供与符合条件的比较次数相同的每个类别。避免这种情况的最简单方法是使用 DISTINCT:

SELECT DISTINCT c FROM Category c JOIN c.comparisons co
WHERE c.safe = true AND co.date > :afterDate
ORDER BY size(c.comparisons) DESC

再次请注意,您应该知道在应用 DISTINCT 时您在做什么,因为访问的数据多于查询显示的数据,这可能会在以后导致性能问题。

关于java - 如何创建 JPA 查询以按远程引用数量的降序返回对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5197721/

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