2017-10-28 1 views
0

요청 개체에 KPI (요청에 KPI 목록 있음)가 매핑 된 OneToMany가 있습니다 ... 이제 일부 매개 변수를 사용하여 특정 요청을 가져와야합니다 조건 (DB 제약 조건이 아님)에 따라 전달 된 매개 변수는 하나의 요청 개체 만 반환해야합니다. 문제는 생성 된 최대 절전 쿼리가 외부 조인을 KPI에 남겨 두었 기 때문에 요청에 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

는이

order by 
    kpiset2_.GRP_KPI_ID asc 

left outer join 원인 순서의 이유가 그이입니다. kpiSet 필드의주석. 그것은 매우 유연한 접근하지 않습니다 원인

은, 내 의견으로는, 당신이 DISTINCT_ROOT_ENTITY 변압기

Criteria.DISTINCT_ROOT_ENTITY vs Projections.distinct

@OrderBy를 사용하지 않는 것이 좋습니다를 사용하려고 할 수 있습니다 중복 행을 제거하십시오.

+0

실제로 OrderBy를 제거해도 문제가 해결되지는 않았지만 Distinct 옵션이 도입 된 이유는 ... 최대 절전 모드가 기본적으로 https://stackoverflow.com/questions/40626002/ko-one에 따라 왼쪽으로 결합된다는 것을 알았습니다. - 많은 - 조인 - 테이블 - 옳지 않은 - 자식 레코드 –

+0

@osamayaccoub 나는 그 질문이 이유를 설명한다고 생각하지 않는다. 거기에 암시 적으로 조인이있다 : Join packagesItem = pRoot.join ("item")'. –

관련 문제