【问题标题】:Criteria Many-to-Many Hibernate标准多对多休眠
【发布时间】:2011-04-12 07:13:35
【问题描述】:
@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;
    }

假设我有语言 Eng Germ、说英语的人、说德语的人以及说英语和德语的人 我想让所有会说英语和德语的人都使用 Criteria。

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=?
    )

【问题讨论】:

    标签: java sql hibernate many-to-many criteria


    【解决方案1】:

    从可以访问会话对象的 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();
    

    【讨论】:

    • 这将列出所有说英语的人,所有说德语的人,以及所有说两种语言的人,我需要的是一个标准,只选择后面的人,会说英语和德语。
    • 啊……比你需要的,而不是 OR :criteria.add(Restrictions.and(languageEN, languageDE));
    • 它应该可以工作......它是一个简单的查询。这是另一个变体: Criteria criteria = getSession().createCriteria(Person.class);标准 = 标准.createCriteria("语言"); criteria.add(Restrictions.eq("name", "en")); criteria.add(Restrictions.eq("name", "de")); List 结果 = criteria.list();
    • 和另一个:Criteria criteria = getSession().createCriteria(Person.class);标准 = 标准.createCriteria("语言"); criteria.add(Restrictions.like("name", "en", MatchMode.EXACT); criteria.add(Restrictions.like("name", "de", MatchMode.EXACT); List 结果 = 标准。列表();
    • 逻辑上它应该可以工作,但它没有......我已经把生成的sql查询放在了数据库上。我真的不知道为什么它没有。我在 link_person_languages 中输入了这些值 pid: 5, 5, 6 lid 1 2 2
    猜你喜欢
    • 2014-09-30
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多