2017-10-28 2 views
0

Ich habe ein Request-Objekt mit OneToMany Zuordnung zu KPIs (Request hat eine Liste von KPIs) ... Jetzt muss ich eine bestimmte Anfrage mit einigen Parametern erhalten In Kriterien festgelegt, nach den Daten (nicht DB-Einschränkungen) die Parameter übergeben sollten nur ein Request-Objekt zurückgeben, das Problem ist, dass Hibernate-Abfrage erstellt Outer Join zu den KPIs verlassen, so wenn die Anfrage hat 5 KPIs innerhalb, 5 doppelte Zeilen sind zurück ... ich brauche nur ein ... wie kann ich diesenWie vermeidet man, dass Ruhezustand linker Outer Join mit OneToMany bei Verwendung der Kriterien

Code zum Lesen erfüllen:

 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); 

anfordern Klasse:

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 Klasse:

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; 

query:

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 

Antwort

0

Offensichtlich haben Sie eine left outer join Ursache dieser

order by 
    kpiset2_.GRP_KPI_ID asc 

Der Grund der Bestellung, dass es ist @OrderBy("groupKpiId") Anmerkung auf dem kpiSet Feld.

So entfernen Sie doppelte Zeilen können Sie versuchen, DISTINCT_ROOT_ENTITY Transformator

Criteria.DISTINCT_ROOT_ENTITY vs Projections.distinct

Es ist besser, nicht @OrderBy zu verwenden, meiner Meinung nach verwenden, weil es nicht eine sehr flexible Ansatz ist.

+0

tatsächlich das Entfernen der OrderBy hat das Problem nicht behoben, aber Einführung der Distinct-Option hat es getan ... Ich habe festgestellt, dass Hibernate diese Links standardmäßig gemäß https://StackOverflow.com/questions/40626002/jpa-one beizutreten -to-many-join-table-give-incorrect-child-records –

+0

@osamayaccoub Ich glaube nicht, dass diese Frage den Grund beschreibt. Dort gibt es einen impliziten Join: 'Join packagesItem = pRoot.join (" item ")'. –

Verwandte Themen