【问题标题】:JPA - Getting data from OneToMany relationship for a given conditionJPA - 从给定条件的 OneToMany 关系中获取数据
【发布时间】:2021-05-03 14:18:13
【问题描述】:

我从table 中选择objects e 列表,它们与另一个表中的对象有one to many 关系。我想获取所有对象,但仅根据某个属性获取其他一些对象。例如,一个电影列表,每部电影都有一系列与之相关的演员,但我只想获得分配给他们薪水的演员。它现在的工作方式仍然返回所有演员的所有电影,唯一的条件是至少有一个演员有工资:

SELECT m FROM movies LEFT JOIN m.actors a WHERE a.salary IS NOT NULL 

我对它在 JPA 中的工作方式没有经验,不确定这种情况下最简单的解决方案是什么。

【问题讨论】:

    标签: hibernate jpa jpql


    【解决方案1】:

    通常,电影和演员是多对多的关系——一部电影中可以有很多演员,而一个演员可能演过几部电影。

    但是,假设演员只出演了一部电影,并且演员实体将 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 加入,您将获得所有有或没有您的条件的电影的列表。

    如果你做inner join,你只会得到那些满足你的条件的电影,即至少有一个演员得到一些薪水。

    但是,通过连接,如果一部电影中有多个演员,您将获得一部电影的多条记录。为避免这种情况,请使用 GROUP BY 子句。

    【讨论】:

    • 谢谢。这只是一个通用示例,它旨在像该假设中那样一对多。然而,这个查询似乎最终会输出相同的结果,即包含所有演员的电影列表,无论该字段是否为空。
    • 用描述更新了查询。
    猜你喜欢
    • 1970-01-01
    • 2013-11-09
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 2017-01-23
    • 1970-01-01
    相关资源
    最近更新 更多