2010-09-14 56 views
3
@Entity 
public class Person implements Serializable { 
    private int id; 
      ........... 
    private Set<Languages> languages = new HashSet<Languages>(); 
     ............... 
    @ManyToMany 
    @JoinTable(name = "link_person_languages") 
    public Set<Languages> getLanguages() { 
     return languages; 
    } 
} 

@Entity 
public class Languages implements Serializable { 
    private int id; 
    private String name; 
    @Id 
    @GeneratedValue 
    public int getId() { 
     return id; 
    } 
    @Column(nullable = false, length = 40, unique = true) 
    public String getName() { 
     return name; 
    } 

可以说我有语言工程胚芽,谁讲英人,人谁讲德语,和人民谁讲英,德 我想所有谁讲人皆有之英语和德语使用标准。标准多到很多Hibernate

crit.createAlias("languages", "l"); 
Conjunction con = Restrictions.conjunction(); 
for (int j = 0; j < o.length; j++) { 
      Criterion tmp = Restrictions.eq("l.id", ((Languages)o[j]).getId()); 
     con.add(tmp); 
} 
crit.add(con); 


select 
this_.id as y0_, 
    this_.lastName as y1_, 
    this_.firstName as y2_, 
    this_.socialNumber as y3_ 
from 
    Person this_ 
inner join 
    link_person_languages languages3_ 
     on this_.id=languages3_.Person_id 
inner join 
    Languages l1_ 
     on languages3_.languages_id=l1_.id 
where 
    (
     l1_.id=? 
     and l1_.id=? 
    ) 

回答

0

从能够访问会话对象(也许延伸的HibernateDaoSupport的)一个DAO对象中:

Criteria criteria = getSession().createCriteria(Person.class); 
criteria = criteria.createCriteria("languages"); 

Criterion languageEN = Restrictions.eq("name", "en"); 
Criterion languageDE = Restrictions.eq("name", "de"); 
criteria.add(Restrictions.and(languageEN, languageDE)); 

List<Person> result = criteria.list(); 
+0

这将列出所有讲工程的人,以及所有讲GER人,以及所有讲这两种语言的人,我需要的是一个标准,只选择后来讲英语和德语的人。 – Darwly 2010-09-15 11:36:04

+0

啊..比你需要而不是OR:criteria.add(Restrictions.and(languageEN,languageDE)); – Ice 2010-09-15 11:40:13

+0

即使不工作,生病得到sql – Darwly 2010-09-15 11:47:02