具有多对多关系的 JPQL 查询
JPQL query with many to many relationship
嘿,所以我在两个表 Knights
和 Quests
之间有一个 多对多关系 。
我想写 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;
}
因为它是多对多关系,你必须再添加一个 table 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 将在后台处理它
如果你只想得到一个Quest
,你的查询和方法应该是这样的:
@Query("SELECT DISTINCT q FROM Knight k JOIN k.stories q WHERE k.id = 1 AND q.id = 1")
Quest findDoneStories();
嘿,所以我在两个表 Knights
和 Quests
之间有一个 多对多关系 。
我想写 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;
}
因为它是多对多关系,你必须再添加一个 table 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 将在后台处理它
如果你只想得到一个Quest
,你的查询和方法应该是这样的:
@Query("SELECT DISTINCT q FROM Knight k JOIN k.stories q WHERE k.id = 1 AND q.id = 1")
Quest findDoneStories();