hibernate - JPA - 从给定条件的 OneToMany 关系中获取数据
问题描述
我正在objects
从 a 中选择一个 e列表,它们与另一个表中的对象table
有关系。one to many
我想获取所有对象,但仅根据某个属性获取其他一些对象。例如,一个电影列表,每部电影都有一系列与之相关的演员,但我只想获得分配给他们薪水的演员。它现在的工作方式仍然返回所有演员的所有电影,唯一的条件是至少有一个演员有工资:
SELECT m FROM movies LEFT JOIN m.actors a WHERE a.salary IS NOT NULL
我对它在 JPA 中的工作方式没有经验,不确定这种情况下最简单的解决方案是什么。
解决方案
通常,电影和演员是多对多的关系——一部电影可以有很多演员,一个演员会演过几部电影。
但是,假设演员只演过一部电影,并且演员实体将 MOVIE_ID 作为存储电影 ID 的列,使用 JPQL 我将查询编写为:
SELECT m.id, m.name FROM Movie m
INNER JOIN Actor a ON a.movieId = m.id AND a.salary IS NOT NULL
GROUP BY m.id, m.name
为了更好地帮助您,请添加您的 Movie 和 Actor 实体类。
编辑:更新了上面的 JPQL 查询以排除没有演员赚取任何薪水的电影。
描述:如果您选择 LEFT 加入,您将获得一份包含或不包含您的条件的所有电影的列表。
如果你做内部加入,你只会得到那些满足你的条件的电影,即至少有一个演员得到一些薪水。
但是,通过连接,如果一部电影中有多个演员,您将获得一部电影的多条记录。为避免这种情况,请使用 GROUP BY 子句。
推荐阅读
- firebase - 无法在 Firebase Web 中发送或检索数据
- javascript - iframe 不会在生产中加载其所有样式
- elasticsearch - 在elasticsearch中停止节点间通信(不使用防火墙阻止端口)
- json - Flutter:为 Http GET 请求发送 JSON 正文
- php - 根据特定产品有条件地删除 Woocommerce 购物车项目
- windows - 带有 Docker 容器的 Windows GUI 应用程序在后台运行 Python 代码
- linux - 我的脚本出错为 avikanch1 Venkat@4444 send: spawn id exp5 not open while execution "send "Venkat@4444\r""
- php - 如何在整个工作区中快速搜索文件(Visual Studio Code)
- amazon-web-services - 连接到 Auto Scaling 组中的 Apache Web 服务器
- xcode - 音频和视频通话的通话指示栏没有响应