gpt4 book ai didi

java - Hibernate 多对多标准投影

转载 作者:行者123 更新时间:2023-11-30 11:57:38 25 4
gpt4 key购买 nike

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

我的情况是这样的,我有两个类 person 和 languages,具有 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();

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

请帮忙发送

最佳答案

你在非常古老的 JDBC 风格中所做的事情(JDBC 是非常古老的人用来访问数据库的方式)将是这样的:

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

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

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

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

关于java - Hibernate 多对多标准投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3703570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com