2017-10-28 230 views
0

我有一个Request对象,它具有OneToMany映射到KPI(请求包含KPI列表)...现在我需要使用某些参数根据数据设置(不是数据库约束),传递的参数应该只返回一个Request对象,问题是创建的Hibernate查询已经离开了KPI的外部连接,所以如果Request中有5个KPI,则有5个重复行回来......我只需要一个...我怎样才能实现这一如何在使用条件时避免休眠时使用OneToMany执行左外连接

代码阅读:

 Criteria criteria = session.createCriteria(GroupKpiRequest.class); 
    criteria.add(Restrictions.eq("levelCategory",LevelCategory.COMPANY)); 
     if(cycleNumber == 0){ 
      cycleNumber = getActiveCycleNo(); 
     } 
     criteria.add(Restrictions.eq("cycleNumber",cycleNumber)); 

     List<GroupKpiRequest> matchingRequests = (List<GroupKpiRequest>) 
criteria.list(); 
     if(matchingRequests != null && matchingRequests.size() == 1){ 
      GroupKpiRequest companyRequestToDelete = 
matchingRequests.get(0); 

请求类:

public class GroupKpiRequest { 
. 
. 
. 
    @OneToMany(mappedBy="groupKpiRequest", cascade={CascadeType.ALL}, fetch=FetchType.LAZY) 
    @Cascade({ 
    org.hibernate.annotations.CascadeType.SAVE_UPDATE, 
    org.hibernate.annotations.CascadeType.DELETE, 
    org.hibernate.annotations.CascadeType.MERGE, 
    org.hibernate.annotations.CascadeType.PERSIST, 
    org.hibernate.annotations.CascadeType.DELETE_ORPHAN//, 
    org.hibernate.annotations.CascadeType.EVICT 
    }) 
@OrderBy("groupKpiId") 
@Fetch(FetchMode.SUBSELECT) 
private List<GroupKPI> kpiSet; 

KPI类:

public class GroupKPI implements Serializable{ 
@OneToOne(fetch=FetchType.EAGER) 
@JoinColumn(name="CALCULATION_METHOD",referencedColumnName="METHOD_NAME") 
private CalculationMethod calculationMethod; 

@ManyToOne 
@JoinColumns({ 
    @JoinColumn(name="GRP_KPI_REQ_ID",referencedColumnName="GRP_KPI_REQ_ID" , nullable=false) 

    } 
) 
@Fetch(FetchMode.JOIN) 
private GroupKpiRequest groupKpiRequest; 

查询:

select ..... 
from 
    REQUEST this_ 
left outer join 
    GROUP_KPI kpiset2_ 
     on this_.GRP_KPI_REQ_ID=kpiset2_.GRP_KPI_REQ_ID 
left outer join 
    CALC_METHOD calculatio3_ 
     on kpiset2_.CALCULATION_METHOD=calculatio3_.METHOD_NAME 
left outer join 
    ORGANIZATION organizati4_ 
     on this_.CYCLE_NO=organizati4_.CYCLE_NO 
     and this_.ORG_ID=organizati4_.ORG_ID 
where 
    this_.deleted = 0 
    and this_.GRP_KPI_REQ_ID=? 
order by 
    kpiset2_.GRP_KPI_ID asc 

回答

0

显然你有left outer join原因这

order by 
    kpiset2_.GRP_KPI_ID asc 

订单的原因,有是@OrderBy("groupKpiId")注释kpiSet字段。

要删除重复的行,你可以尝试使用DISTINCT_ROOT_ENTITY变压器

Criteria.DISTINCT_ROOT_ENTITY vs Projections.distinct

最好不要使用@OrderBy,在我看来,因为它不是一个非常灵活的方法。

+0

实际上删除OrderBy没有解决问题,但引入了Distinct选项做到了这一点......我发现hibernate默认根据https://stackoverflow.com/questions/40626002/jpa-one -to-many-join-table-give-incorrect-child-records –

+0

@osamayaccoub我不认为这个问题描述了原因。有一个隐式连接:'连接 packagesItem = pRoot.join(“item”)'。 –