【问题标题】:Transform SQL statement into JPQL to get latest entries for each user将 SQL 语句转换为 JPQL 以获取每个用户的最新条目
【发布时间】: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


【解决方案1】:

查看最终更新:如果您使用 nativeQuery = true,则可以使用初始 SQL 语句 - 当然代码将不可移植,因为本机查询绑定到(当前)数据库类型

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-18
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多