Hibernate多对多标准投影

时间:2010-09-13 19:08:55

标签: java hibernate many-to-many hibernate-criteria nhibernate-projections

编辑>我处于死胡同......所以我可以继续寻找主要原因..请告诉我如何为多对多关系制定一个简单的标准,其中有多个eq限制,例如,如何获得说英语的人这里显示的例子中有德语...

我的情况是这样的,我有两个班级的人和语言,有一个n,m的关系..我正在使用一个标准来进行搜索 - 得到所有说出前的人。英语和德语

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

标准

    Criteria crit = session.createCriteria(Person.class);
    crit.setCacheable(true);
    ProjectionList projList = Projections.projectionList();
    projList.add(Projections.property("languages"));
    c = enumMap.get(attr);
    if (c.isChanged()) {
       Criteria crit2 = crit.createCriteria("languages");
       Object[] o = (Object[]) c.getAnswer();
       Conjunction con = Restrictions.conjunction();
       for (int j = 0; j < o.length; j++) {
              Criterion tmp = Restrictions.eq("id", ((Languages)o[j]).getId());
              con.add(tmp);
       }
       crit2.add(con);

    }
    crit.setProjection(projList);
    retList = crit.list();

有趣的是,如果我只为一种语言设置它,我会获得正确的人员列表,但是对于不止一种语言我没有,我重新检查我的基础并设置一个人专门讲两种语言。但是什么提示mi比什么都重要的是来自Set []的投影结果在Set语言所在的地方,有NULL值......

请帮忙 TNX

1 个答案:

答案 0 :(得分:1)

你在非常古老的JDBC风格中所做的事情(JDBC是老人们用来访问DB的东西)会是这样的:

SELECT * FROM PERSON WHERE LANGUAGE_ID = 1 AND LANGUAGE_ID = 2

(仅举例,不完全是SQL)

而且,如果你运行这个sql,它将永远不会返回一行(非常悲伤...),因为表中没有,LANGUAGE_ID = 1 AND LANGUAGE_ID = 2。

我真的不知道解决问题的最佳方法(Hibernate不是我最强的技能),但在你的情况下(如果语言数字不是那么大)我会做2(或3,或循环) )然后使用代码中的简单Set进行选择和连接。不是最好的解决方案......如果有人表现出更好的方式,我会很高兴