【发布时间】:2023-03-25 13:30:01
【问题描述】:
我要转换 SQL 语句
SELECT * FROM (SELECT * FROM `votes` ORDER BY `date` DESC) AS sub GROUP BY `username`
进入 JPQL。我们的想法是为每个用户 (GROUP BY username) 获得最新的投票 (ORDER BY date DESC)。
我了解 JPQL 不支持 FROM 中的子查询,所以我尝试了“IN”
# does not work!
SELECT v FROM Vote v WHERE v.id IN (SELECT tmp.id FROM Vote tmp ORDER BY date DESC) GROUP BY v.username
但这给了我第一个条目。然后我尝试了“MAX”
# does not work!
SELECT v FROM Vote v WHERE v.date IN (SELECT MAX(tmp.date) FROM Vote tmp GROUP BY tmp.username)
同样,但这给了我同一用户的多个条目,因为 date 不是唯一的...
编辑:
我曾想过从 SQL 语法创建一个 VIEW 作为一种解决方法,但由于 JPQL 查询引用的是类(而不是表),这并没有让我走得太远 ;-)
编辑:
然后我想到了 JOIN 和 lead me to Native Queries。原来我可以将上面的 SQL 与 nativeQuery = true 一起使用:
@Query(value = "SELECT * FROM (SELECT * FROM `votes` ORDER BY `date` DESC) AS sub GROUP BY `username`", nativeQuery = true)
这行得通!
【问题讨论】:
-
JPQL 被翻译成 SQL。那么您的 JPQL 的 SQL 是什么?您使用的任何 JPA 实现的日志都会告诉您。如果某些东西不是唯一的,那么添加 UNIQUE 可能会有所帮助...
-
我的 JPQL 的 SQL 是我问题中的第一个代码块。 – 我不想在日期中添加 UNIQUE,因为日期是 DATETIME,而不是 TIMESTAMP
-
啊,PS:连TIMESTAMP都不是唯一的,见stackoverflow.com/a/10321407/3890673
-
我不是在谈论您想要的 SQL ,我是在谈论为该 JPQL 执行的 SQL。那么你就知道你的 JPQL 是否与你的目标一致
-
啊!对不起,谢谢。我启用了
spring.jpa.show-sql: true的日志记录,响应为Hibernate: select ... from votes vote0_ where vote0_.id in (select vote1_.id from votes vote1_ order by vote1_.date DESC) group by vote0_.username- 这几乎是我所写内容的更长版本...问题是:我必须做什么而不是 来获取最新条目
标签: jpa spring-data-jpa