【问题标题】:Hibernate Many-to-Many Criteria ProjectionHibernate 多对多标准投影
【发布时间】:2010-09-13 19:08:54
【问题描述】:

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

我的情况是这样的,我有两个班级人和语言,有一个 n,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();

有趣的是,如果我只为一种语言设置它,我会得到正确的人员列表,但对于不止一种语言我没有得到,我重新检查了我的基础并专门设置了一个人说 2 种语言.但最让mi提示的是,Object[]中的投影结果在Set语言应该存在的地方,有NULL值......

请帮忙 tnx

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我也在想同样的事情,但我不是很确定,但这里的主要问题是如何从 Set 中获取选择,因为 Object[] 位置在那个位置始终为空...
    猜你喜欢
    • 2010-12-06
    • 2013-07-21
    • 2014-01-28
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 2011-10-08
    • 1970-01-01
    相关资源
    最近更新 更多