【问题标题】:How to make a JPA query with LEFT OUTER JOIN如何使用 LEFT OUTER JOIN 进行 JPA 查询
【发布时间】:2011-06-12 15:08:20
【问题描述】:

基于这两个表(及其对应的实体):

profiles(id, email, name)
items(id, profile_id, rank, price)

Profile(email, name)
Item(profile, rank, price)

我必须列出所有配置文件,按项目的最佳排名排序(实际上这是一个“顶级配置文件”列表)。

这是你可以在 PHPMyAdmin 中执行的 SQL 请求,例如:

SELECT AVG(i.rank) AS rank, p.* FROM profiles AS p LEFT OUTER JOIN items AS i ON p.id = i.profile_id GROUP BY p.id ORDER BY rank DESC;

我是 JPA 的新手,我找不到一些关于使用 CriteriaBuilder 进行 LEFT OUTER JOIN 的示例(如果这样做是正确的)。

如果有人能引导我走上正确的道路,我将不胜感激(我不是要求别人做我的工作,只是有很好的线索)。

非常感谢! :)

【问题讨论】:

  • 您使用哪种 JPA 实现?据我记得,在 Hibernate 中通过 JPA 2.0 Criteria API 表达这样的查询存在一些问题。
  • 我使用 Play!框架(playframework.org/documentation/1.1/jpa),但我不能告诉你他们使用哪个版本(如果这就是你问的原因:/)

标签: sql jpa criteria


【解决方案1】:

这个查询可以用JPQL表示如下:

SELECT p, AVG(i.rank) as rank
FROM Item i RIGHT JOIN i.profile p
GROUP BY p
ORDER BY rank DESC

请注意,您不能在 JPA 中写任意的JOINs,只能在关系上写JOINs,因此这里需要一个RIGHT JOIN,因为您的关系是单向的,关系的来源应该在左边一边。

这个查询可以在 JPA 2.0 Criteria API 中以非常简单的方式翻译,但是,上次我检查它时,Hibernate 的 Criteria API 实现不支持右连接(Play Framework 在下面使用 Hibernate)。所以,我认为在这种情况下你必须使用 JPQL 查询。

【讨论】:

  • 这太完美了!但是您认为可以使用 Java 和 EntityManager、CriteriaBuilder 等吗?
  • @cx42net:此查询使用EntityManager 执行。关于CriteriaBuilder - 我再说一遍,它不起作用。
  • 哦,好吧。感谢您的帮助:)
猜你喜欢
  • 2020-02-26
  • 2012-04-29
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
相关资源
最近更新 更多