2011-05-10 186 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();