One To Many将获取忽略条件中where条件的所有子记录

时间:2013-07-11 16:54:08

标签: hibernate

我在Hibernate.Say报告和项目表中有一对多关系。一个报告有许多项目和项目可以处于活动或非活动状态。我需要使用活动项目获取所有报告。

Class Report{
    @OneToMany(mappedby="reports")
    List<Projects> projList;
    /*get and set methods */    
} 

Class Project{        
    @ManyToOne
    Report repors;
    /*get and set methods */        
    /*This is a column which represenst ACTIVE or NOT*/
    private status;
}        

我试图用活动项目提取所有报告,我的标准是这样的:

List<Reports> reportsList = Criteria(Reports.class)
      .createAlias("projList","projList",INNER_JOIN)
      .add(Restrictions.eq("projList.status","ACTIVE")).list()

当我遍历reportsList并获得相应的项目时,无论是ACTIVE还是INACTIVE,它都会返回给我所有的项目。

for(Report rep:reportsList){
  rep.getProjList(); 
  //This is returning me all the projects irresective of my criteria for 
 // ACTIVE projects. This is hitting another query to the table with the report id 
 //only but not with the status= ACTIVE.So this is returning me all the Projects.
} 

但是当我执行LEFT OUTER JOIN而不是INNER JOIN时,我收到了正确的结果,即只有ACTIVE Project。我不确定为什么?

您能否请您解释一下如何以及它是否正确并且在所有情况下都是合理的? 或者我应该加载ACTIVE项目并获取相应的报告 即具有项目标准(从孩子到父母)

1 个答案:

答案 0 :(得分:3)

使用where clause在只包含活动项目的Report实体中创建只读集。

@OneToMany(mappedby="reports")
@Immutable
@Where(clause="status='ACTIVE'")
List<Projects> activeProjList;

这个集合必须是只读的,因为您必须确保实体的一致性,因此必须在projList集合中进行修改。

关于注释抱歉,如果有任何错误,我通常使用xml映射文件。