我有一对多的关系,我需要抓取关联表,并使用条件过滤2个表。这是我的代码..
public ArrayList<Student>getListOfStudents() {
Session session = getHibernateTemplate().getSessionFactory().openSession();
Criteria like = session.createCriteria(Student.class)
.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
prepareForSelect(like);//some filtering
Criteria innerCriteria = like.createCriteria("phone","p",JoinType.LEFT_OUTER_JOIN);
prepareForSelect(innerCriteria);//same filtering but in phone now..
like.addOrder(Order.asc("c01"));
Iterator<java.util.Map<Object,Object>> ite = like.list().iterator();
HashSet<Student>students= new HashSet<Student>();
while(ite.hasNext())
{
java.util.Map<Object,Object> map = ite.next();
Student aStudent = (Student)map.get(Criteria.ROOT_ALIAS);
Phone phone = (Phone)map.get("p");
if(student.contains(aStudent))
students.addPhoneToStudent(phone); //add to phone hashSet in Student.class
else
{
student.setListOfPhones(new HashSet<Phone>(0));
students.addPhoneToStudent(phone);
students.add(student);
}
session.close();
return new ArrayList<Student>(students);
}
一切都还可以,但是如果学生没有满足标准限制的电话(isValidPhone = true),学生不在结果集中,即使没有有效的电话也需要学生,因为应用程序应该能够为学生添加新手机可以有人给小费。非常感谢
答案 0 :(得分:0)
这对我有用..基本上我把第二个表(关联)表的限制放在一般哪里(查询子句)这意味着1表正在影响它对这个2表的限制诀窍是这里。将限制仅限于左外连接这里是一些代码。[你想要在2表中的限制。]
org.hibernate.criterion.Conjunction innerRestrictions = (org.hibernate.criterion.Conjunction)Restrictions.conjunction().add(Restrictions.eq("phoneValid",true)).add(Restrictions.eq("phoneMatch",true));
然后在这里检索2表中的所有关联。
like.createCriteria("phone","p",JoinType.LEFT_OUTER_JOIN,innerRestrictions);
这里你要求休眠在现场电话上创建一个innerCriteria(关系的许多方面)创建一个别名'p'fetch is left outer join意味着没有电话的学生仍然在resultSet上之后你想要应用于innerCriteria希望它有帮助的标准的限制。