具有多对多关系的 JPQL 查询

Posted

技术标签:

【中文标题】具有多对多关系的 JPQL 查询【英文标题】:JPQL query with many to many relationship 【发布时间】:2021-10-21 00:58:06 【问题描述】:

嘿,所以我在两个表KnightsQuests 之间有一个多对多关系

我想写JPQL查询,在那里我也从id为1的骑士那里获得id的1的任务,稍后我会将其更改为任务状态,但现在我想让它工作:

@Query("select  k.quests from Knight k join k.quests q  where k.id=1 and q.id=1")
Collection<Quest> findDoneStories();

这有点用,因为它给了我来自 id 1 的骑士的任务,但它给了我所有的任务,而不是只有一个 id 为 1 的任务。

@Entity
@Table(name = "knights")
public class Knight 

    @Id
    @Column(name = "id")
    int id;
    
    @Column
    String name;
    
    @Column(name = "status")
    @Enumerated(EnumType.STRING)
    private KnightEnum status;
    
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "knights_quests", joinColumns = @JoinColumn(name = "id_knights"),
        inverseJoinColumns = @JoinColumn(name = "id_quest"))
    List < Quest > stories;

@Entity
@Table(name = "quests")
public class Quest 

    @Id
    @Column(name = "id")
    int id;
    
    @Column
    String name;
    
    @Column(name = "description")
    String description;
    
    @Column(name = "status")
    @Enumerated(EnumType.STRING)
    QuestEnum status;
    
    @Column(name = "story_points")
    int storyPoints;
    
    @ManyToMany(mappedBy = "stories", fetch = FetchType.EAGER)
    List < Sprint > knights;

【问题讨论】:

【参考方案1】:

由于它是多对多关系,因此您必须再添加一个表 knights_quests,其中包含以下列:knighs_id 和 quests_id,例如,您可以在其中存储 1 和 1。

您的实体将是这样的:

@ManyToMany() @JoinTable(name = "knights_quests", joinColumns = @JoinColumn(name = "knighs_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "quests_id",referencedColumnName = "name") )

在您可以使用简单连接执行查询之后,JPQL 将在后台处理它

【讨论】:

我之前有额外的表,我添加了referencedColumnName,但我的查询有相同的输出。【参考方案2】:

如果你只想得到一个Quest,你的查询和方法应该是这样的:

@Query("SELECT DISTINCT q FROM Knight k JOIN k.stories q WHERE k.id = 1 AND q.id = 1")
Quest findDoneStories();

【讨论】:

稍后我将通过它们的状态来检查它们,现在我只想让它工作并且我想要列出只有一个 id 为 1 的任务,而不是所有具有不同 id 的任务 是的,如果您尝试一下,您会发现它只为您提供 Quest 和 1 个 ID。如果您真的想要不同的东西,您可能需要展示示例数据和结果。 我找到了解决方案,问题是我返回了 k.quests 而不是 q。

以上是关于具有多对多关系的 JPQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

返回涉及多对多关系的实体的 JPQL 查询

多对多关系中没有项目的实体的 JPQL

多对多查询 jpql

JPQL在多对多关系上左外连接

JPQL 多对多 Dto 选择失败

JPQL 基于条件的多对多连接