요청 개체에 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
실제로 OrderBy를 제거해도 문제가 해결되지는 않았지만 Distinct 옵션이 도입 된 이유는 ... 최대 절전 모드가 기본적으로 https://stackoverflow.com/questions/40626002/ko-one에 따라 왼쪽으로 결합된다는 것을 알았습니다. - 많은 - 조인 - 테이블 - 옳지 않은 - 자식 레코드 –
@osamayaccoub 나는 그 질문이 이유를 설명한다고 생각하지 않는다. 거기에 암시 적으로 조인이있다 : Join packagesItem = pRoot.join ("item")'. –