0

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

我有 2 个类 Person 和 Tag。

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

现在我想检索属于所有给定标签的所有人。
例如
,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;
4

2 回答 2

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

顺便说一句,我没有测试它。希望能帮助到你。

于 2012-07-04T16:27:38.223 回答
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

于 2012-07-05T13:48:04.790 回答