2011-05-10 192 views
1

我有一個類Person,每個人都可以擁有特定語言的文檔。 Person和Document類與多對多關係相關聯。休眠多對多關係查詢

我的Java代碼如下所示:

@Table(name="person") 
public class Person { 
    @Id 
    @Column(name="id") 
    private Long id; 

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

    @ManyToMany(targetEntity=Document.class) 
    @JoinTable(name="person_document", 
    joinColumns={ 
     @JoinColumn(name="person_id") 
    }, 
    inverseJoinColumns={ 
     @JoinColumn(name="document_id") 
    } 
) 
    private List<Document> documents; 

    // getter and setter .... 
} 

public class Document { 
    @Id 
    @Column(name="id") 
    private Long id; 

    @Column(name="language") 
    private String language; 

    // getter and setter ... 
} 

注:我使用的是Hibernate 3的位置。

我想創建一個查詢,讓我回到所有人只有在一個特定的語言,如英語文件。

我第一次嘗試下面的代碼

Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
session.beginTransaction(); 
session.createCriteria(Person.class) 
    .createAlias("documents", "d") 
    .add(Restrictions.eq("d.language", "english") 
    .list(); 

該代碼清單究竟是誰在英語我希望所有的人,但只有在英國每個人的文檔文件的人。

例如:

  • 人A在英語
  • 人員B原稿X具有文件中的Y法語和英語(2個文件實際上)
  • 人C具有在法國
  • 文件ž

我想獲得上市:

  • 一個人用英語
  • 某乙原稿X與文檔的Y英文
  • 一個人沒有文件

這是否有意義?如果是這樣的話,Hibernate查詢如查詢如何。

因爲這真的很難得到我在想這是做錯的方法,但我不知道有任何其他的方式來做到這一點。

我感謝您的幫助!

回答

2

您應該查詢反之亦然。這意味着您應該加載英文文檔,並從該文檔對象中加載您可以獲得的人員。

Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
session.beginTransaction(); 
session.createCriteria(Documentn.class) 
    .createAlias("documents", "d") 
    .add(Restriction.eq("d.language", "english") 
    .list();