Java JPA:处理多对多关系

Java JPA:处理多对多关系,java,jpa,many-to-many,Java,Jpa,Many To Many,我使用的是JPAAPI 2.0-cr-1(Maven) 我有两门课:个人课和标签课 每个人可以有多个标签,反之亦然 现在我想检索属于所有给定标签的所有人员。 例如, person1被标记为“高大”、“肥胖”和“粗体” person2被标记为“高”和“瘦” person3被标记为“高大”和“粗体” 现在的问题是如果 我查询[“高”、“粗”] 我应该得到[person1,person3] i、 e.我想检索属于所有给定标签的人员。 public class Person { @Id

我使用的是JPAAPI 2.0-cr-1(Maven)

我有两门课:个人课和标签课

每个人可以有多个标签,反之亦然

现在我想检索属于所有给定标签的所有人员。
例如,
person1被标记为“高大”、“肥胖”和“粗体”
person2被标记为“高”和“瘦”
person3被标记为“高大”和“粗体”

现在的问题是如果 我查询[“高”、“粗”]
我应该得到[person1,person3]
i、 e.我想检索属于所有给定标签的人员。

public class Person {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Column(name = "person_name")
    private String personName;

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name = "person_tag", joinColumns = { @JoinColumn(name = "person_id") }, inverseJoinColumns = @JoinColumn(name = "tag_id"))
    private Set<Tag> tags;
}

public class Tag {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name = "person_tag", joinColumns = { @JoinColumn(name = "tag_id") }, inverseJoinColumns = @JoinColumn(name = "person_id"))
    private Set<Person> persons;
公共类人物{
@身份证
@列(name=“id”)
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
@列(name=“人名”)
私有字符串personName;
@ManyToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
@JoinTable(name=“person\u tag”,joinColumns={@JoinColumn(name=“person\u id”)},inverseJoinColumns=@JoinColumn(name=“tag\u id”))
私有集标签;
}
公共类标签{
@身份证
@列(name=“id”)
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
@ManyToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
@JoinTable(name=“person\u tag”,joinColumns={@JoinColumn(name=“tag\u id”)},inverseJoinColumns=@JoinColumn(name=“person\u id”))
私人团体;

如果要查找查询,可以尝试以下查询。 在这里,我使用了“tag.name”,而不是id。但是如果它对您有效,您知道如何更改它

select p from Person p 
  left join p.tags as t where t.name in ("tall","bold") 
group by p having count(p)=2
顺便说一句,我没有测试它。希望它有帮助

Select p from Person p join p.tags t1 join p.tags t2 where t1.name = 'tall' and t2.name = 'bold'
看,,

@Kent,我已经编辑过了。现在更清楚了吗?