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

如何使用LEFT OUTER JOIN进行JPA查询

应瀚
2023-03-14
问题内容

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

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的示例(如果这样做是正确的话)。

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

非常感谢你!:)


问题答案:

该查询可以在JPQL中表示如下:

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

请注意,您不能JOIN在JPA中编写任意的,只能JOIN在关系上使用,因此您需要在RIGHT JOIN此处,因为您的关系是单向的,并且关系的来源应在左侧。

可以使用JPA 2.0 Criteria API以非常简单的方式来翻译此查询,但是,我上次检查该查询时,Hibernate的Criteria
API的实现不支持正确的联接(并且Play框架在下面使用了Hibernate)。因此,我认为您必须在这种情况下使用JPQL查询。



 类似资料:
  • 我正在使用一个JPA查询,它使用一个规范来检索实体。当我执行查询时,我得到了一个错误: 组织。springframework。数据映射。PropertyReferenceException:找不到类型任务的属性名称! 我已经查看了之前在该网站上提出的类似问题的答案 当我使用调试器逐步检查代码时,条件生成器中的扩展路径将返回嵌入的ID类,但当规范实际用于查询时,该属性似乎正在应用于基本实体类。 我是

  • 问题内容: 这是SQL中的JOIN问题更新语句的扩展,但是我尝试使用Spring Data JPQL。 我正在尝试将更新与JPQL中的JOIN一起使用,如下所示 但是,我得到如下错误 org.hibernate.hql.internal.ast.QuerySyntaxException:期望“设置”,找到“ JOIN” JPQL中无法进行UPDATE和JOIN吗?有什么选择。谢谢 问题答案: 该J

  • 问题内容: 如何使用NHibernate进行此查询 我正在使用NHibernate3。 我尝试使用新的Linq提供程序来完成此操作,但未成功。只要它产生上面确切的sql查询,我就不在乎它的执行方式。我希望编写一个强类型查询,如果可能的话,不要使用魔术字符串。 我是NHibernate的新手,所以这个问题可能很简单。 这是更多信息 我将Fluent NHibernate与AutoMappings结合

  • 如何使用RxJava的Android Room进行单行查询?我可以查询项目列表,没有问题。这里,我想找出是否存在特定的行。根据文档,如果不存在行,我可以返回Single并检查EmptyResultSetException异常。 我可以吃一些类似的东西: 如何使用此呼叫?看起来有一些onError/onSuccess,但在单个上找不到这些方法 任何可行的例子都会很好!

  • 我是新来的Node.js,并试图检查如果电子邮件已经通过发送电子邮件作为一个url参数从iOS应用程序。它不起作用,不确定我做错了什么。 我无法console.log前端发送的VSCode中的电子邮件参数,它在XCODE(http://localhost:3000/api/user/email/test@gmail.com)中打印,我知道后端正在获取GET请求。 我的路由器代码是: 非常感谢。

  • QueryDSL定义了一个接口,通过调用或可以轻松地为任何字段获取该接口的实例。Spring Data JPA的接口甚至有一个方法,它将作为参数。 但是对QueryDSL一无所知,它有自己定义查询排序顺序的方法,即。它可以包含许多,它们与非常相似,只是它们不是类型安全的。 所以,如果我想做使用排序的分页查询,真的没有办法使用QueryDSL来定义它吗?