Hibernate Criteria.ALIAS_TO_ENTITY_MAP到ArrayList学生缺失

时间:2013-05-20 14:35:57

标签: java hibernate alias criteria

我有一对多的关系,我需要抓取关联表,并使用条件过滤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),学生不在结果集中,即使没有有效的电话也需要学生,因为应用程序应该能够为学生添加新手机可以有人给小费。非常感谢

1 个答案:

答案 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希望它有帮助的标准的限制。