编辑>我处于死胡同......所以我可以继续寻找主要原因..请告诉我如何为多对多关系制定一个简单的标准,其中有多个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
答案 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进行选择和连接。不是最好的解决方案......如果有人表现出更好的方式,我会很高兴