java 无法正确地制定我的存储库方法,以获取存在于另一个对象中的对象列表

cnwbcb6i  于 2023-06-04  发布在  Java
关注(0)|答案(1)|浏览(361)

这是我第一次使用Springboot和JPA,我正在努力编写一个存储库方法。
我有两个对象:

public class ObjectA{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "objectA_id")
    private Integer id;

    @Column(length=40, unique=true, nullable = false)
    private String label;
}

和/或

public class ObjectB{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="objectB_id")
    private Integer id;

    @Column(length = 100, nullable = false, unique = true)
    private String label;

    @ManyToMany
    @JoinColumn(name="refObjectA_id", nullable = false)
    private List<ObjectA> ObjectAs;
}

现在,我想有一个仓库方法来获取对象A,如果至少有一个对象B“链接”到它。由于我不知道如何做到这一点,我写了一个MySQL查询,我测试和工作完美,但我想知道是否有一种方法可以做到这一点,而不指定查询。
下面是查询:

SELECT *
FROM objectA
WHERE objectA_id IN 
(SELECT objectAs_id FROM objectB_objectAs)

objectB_objectAs是两个对象之间的连接表。
如果有人有关于如何做这样的事情的想法,我会很高兴听到这一点:)
感谢您的阅读!

toiithl6

toiithl61#

开始,对于这种多对一的关系,不应该有一个“连接表”,表A中的记录应该简单地引用表B中的ID。
只有在多对多关系的情况下,如果每个对象可以链接到许多其他对象,“连接表”才是必需的。
然后,您的SQL查询将是:

SELECT *
FROM objectA
WHERE objectA.objectB_id is not null

那么在JPQL中编写它就很简单了
更新:
由于真正的关系似乎是“多对多”而不是“多对一”(一个B可以有多个A,但一个A也可以链接到多个B),SQL查询应该是这样的:

SELECT *
FROM objectA A
LEFT JOIN objectA_objectB AB ON AB.objectA_ID = A.ID
WHERE AB.objectB_ID is not null

JPQL中确实存在“LEFT JOIN”:https://www.baeldung.com/jpa-join-types

相关问题