2017-10-28 6 views
0

私は、KPIへのOneToManyマッピングを持つRequestオブジェクトを持っています(要求にはKPIのリストがあります)...今、 (DBの制約ではない)データに基づいて条件を設定すると、1つのリクエストオブジェクトのみが返されます。作成されたハイバネートクエリがKPIに外部結合を残しているため、5つのKPIが内部にあります。返された...私は読書のために、この基準を使用しているときに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オプションが導入されました...これは、hibernateがデフォルトでhttps://stackoverflow.com/questions/40626002/jpa-one多対多テーブルの間違った子レコード –

+0

@osamayaccoub私はその質問がその理由を記述しているとは思わない。 'Join packagesItem = pRoot.join(" item ")'という暗黙的な結合があります。 –

関連する問題