JPA:处理多对多的关系

时间:2012-07-04 15:22:14

标签: java jpa many-to-many

我正在使用jpa-api 2.0-cr-1。(Maven)

我有2个人员和标签。

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

现在我想检索属于所有给定标签的所有人 例如
person1标有“tall”,“fat”和“bold”
person2标有“tall”和“thin”
person3标有“tall”和“bold”

现在的问题是,如果 我查询[“tall”,“bold”]
我应该得到[person1,person3]
即我想检索属于所有给定标签的人。

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;

2 个答案:

答案 0 :(得分:0)

如果您正在寻找查询,可以尝试以下方法。 在这里我使用了“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
顺便说一句,我没有测试过。希望它有所帮助。

答案 1 :(得分:0)

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

请参阅, http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#JOIN