0

jpa-api 2.0-cr-1 を使用しています。(Maven)

Person と Tag の 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;
4

2 に答える 2

0

クエリを探している場合は、次のクエリを試すことができます。ここでは、id ではなく「tag.name」を使用しました。しかし、それがうまくいく場合は、それを変更する方法を知っています。

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 に答える