2

我在 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()

当我遍历报告列表并获取相应的项目时,无论是 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 项目。我不确定为什么?

您能否解释一下如何以及它是否正确,并且在所有情况下都会保持一致?或者我应该加载活动项目并获得相应的报告,即具有项目标准(从孩子到父母)

4

1 回答 1

3

使用where 子句Report在您的实体中创建一个只读集,该集将仅包含活动项目。

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

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

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

于 2013-07-11T20:22:22.557 回答