繁体   English   中英

具有多对多关系的 JPQL 查询

[英]JPQL query with many to many relationship

嘿,所以我在两个表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;
}

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

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

因为它是多对多的关系,你必须添加一个表 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 将在后台处理它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM