标准:多对多Hibernate

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;
    }

假设我有英语、德语两种语言,会讲英语的人、会讲德语的人以及会讲英语和德语的人。我想使用条件获取所有会讲英语和德语的人。
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=?
    )
1个回答

0

在一个具有访问会话对象的DAO对象内部(可能是扩展了HibernateDaoSupport的对象):

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();

这将列出所有讲英语和德语的人,以及所有讲两种语言的人,我需要的是一个选择只有后者,即会说英语和德语的人的标准。 - Darwly
啊..那么你需要使用and而不是OR:criteria.add(Restrictions.and(languageEN, languageDE)); - Ice
应该可以运行......这是一个简单的查询。以下是另一种变体:Criteria criteria = getSession().createCriteria(Person.class); criteria = criteria.createCriteria("languages");criteria.add(Restrictions.eq("name", "en")); criteria.add(Restrictions.eq("name", "de"));List<Person> result = criteria.list(); - Ice
Criteria criteria = getSession().createCriteria(Person.class); criteria = criteria.createCriteria("languages");criteria.add(Restrictions.like("name", "en", MatchMode.EXACT); criteria.add(Restrictions.like("name", "de", MatchMode.EXACT); List<Person> result = criteria.list(); - Ice
逻辑上应该可以工作,但实际上却没有... 我已经放置了生成的 SQL 查询,并在数据库上使用它。但我真的不知道为什么它不起作用。我已经在 link_person_languages 中输入了这些值:pid: 5、5、6,lid: 1、2、2。 - Darwly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接