0

我有一对多的关系,我需要急切地获取关联表,并使用条件过滤这两个表。这是我的代码..

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),学生不在结果集中,即使没有有效电话,我仍然需要学生,因为应用程序应该能够添加新的学生的电话可以有人给小费。非常感谢

4

1 回答 1

0

这对我有用.. 基本上我将第二个表(关联)表的限制放在通用 where(查询子句)上,这意味着 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);

在这里,您要求休眠以在字段 phone(关系的多方面)上创建一个 innerCriteria 创建一个别名 'p' 提取是左外部连接意味着完全没有电话的学生仍然在 resultSet 和后来的限制您想将 innerCriteria 应用于标准,希望它有所帮助。

于 2013-05-20T21:38:08.937 回答