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
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 –
@osamayaccoub Ich glaube nicht, dass diese Frage den Grund beschreibt. Dort gibt es einen impliziten Join: 'Join packagesItem = pRoot.join (" item ")'. –