2

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

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

@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提示的是,Object[]中的投影结果在Set语言应该在的地方,有NULL值……

请帮助tnx

4

1 回答 1

1

您在非常古老的 JDBC 样式中所做的事情(JDBC 是非常古老的人用来访问 DB 的方式)将是这样的:

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

(只是示例,不完全是 SQL)

而且,如果您运行此 sql,它将永远不会返回一行(非常难过...),因为表中没有LANGUAGE_ID = 1 和 LANGUAGE_ID = 2 的

我真的不知道解决您的问题的最佳方法(休眠不是我最擅长的技能),但在您的情况下(如果语言数量不是那么大)我会选择 2 个(或 3 个,或一个循环)然后在代码中使用简单的 Set 加入。不是最好的解决方案......如果有人展示更好的方法,我会很高兴

于 2010-09-17T12:52:07.153 回答