2017-12-07 15 views
0

与えられた2つのエンティティ:(削除)ppg_status列(フィールドエンティティにstatusと命名)'A'(アクティブ)であるか、または'D' Hibernate @OneToMany明示的な結合テーブルエンティティにwhere句を追加する方法はありますか?

を持って

  • Card
  • PurchaseProductGroup

      、これらは概念的に多対多の関係を持ちますが、明示的に定義された PurchaseProductGroupCardという名前の結合テーブルエンティティが使用されます(したがって、各マッピングに外部IDを割り当てることができます)。したがって、 CardPurchaseProductGroupの両方は、 PurchaseProductGroupCard@OneToManyの関係を持ちます。 Cardに以下があります:

      @OneToMany(mappedBy = "card") 
      private Set<PurchaseProductGroupCard> purchaseProductGroups; 
      

      これは'D'の状態にpurchaseProductGroupsが除外されるように制限する必要があります。

      @Where(clause = "exists (select * from purchase_product_group ppg 
               where ppg.ppg_id = ppg_id AND ppg.ppg_status <> 'D')") 
      

      ...しかし、これを行うには良い方法があります:動作するように思われる一つのアプローチは、ちょうど@OneToMany下に@Where注釈を入れているのですか?理想的には、テーブルに参加して"purchaseProduct.status <> 'D'")のような節を持つためにHibernateを好むでしょうか?

  • 答えて

    0

    私はSQLログを有効にして、クエリの出力を調べました。

    @Where(clause = "ppg_status <> 'D'") 
    

    しかし、それはそのが判明:だから必要がすでに含まれており、必要とされるであろうことすべてが、このあるようにそれに見えている参加

    /* load one-to-many com.prepaytec.pacasso.common.model.Card.purchaseProductGroups */ select * /* the actual field list has been omitted for brevity */ from pacasso.purchaseprodgrp_card purchasepr0_ inner join pacasso.purchase_product_group purchasepr1_ on purchasepr0_.ppg_id=purchasepr1_.ppg_id where ( exists ( select * from purchase_product_group ppg where ppg.ppg_id = purchasepr0_.ppg_id AND ppg.ppg_status <> 'D' ) ) and purchasepr0_.crd_id=? 

    :上記のケースの場合には、このでした別名たら残念ながら

    where 
        (
         purchasepr0_.ppg_status <> 'D' 
        ) 
        and purchasepr0_.crd_id=? 
    

    です:Hibernateのよう作業が間違ったテーブルの別名を付加しません。テーブルに割り当てられているため、元のテーブル名を使用することはできません。したがって、purchase_product_group.ppg_status <> 'D'は機能しません。そして、私はHibernateがプログラムで使用するエイリアス名を決定する方法を知らないので、現在のところ、選択はHibernate(すなわちpurchasepr1_.ppg_status <> 'D')によって使用されることが判明しているエイリアス名のハードコードか、 existsの方法で問題に記載されています。

    更新:詳しい調査では、エイリアス名のハードコーディングが必ずしも実行可能ではないことが判明しました。

    /* criteria query */ 
    select 
        * /* the actual field list has been omitted for brevity */ 
    from 
        pacasso.merchant_acquirer this_ 
    left outer join 
        pacasso.purchaseprod_merchant_acquirer purchasepr2_ 
         on this_.mac_id=purchasepr2_.mac_id 
         and (
          // This wouldn't work with any alias since the required 
          // table is pacasso.purchase_product purchasepr3_, which 
          // is joined below. 
          purchasepr2_.ppr_status <> 'D' 
         ) 
    left outer join 
        pacasso.purchase_product purchasepr3_ 
         on purchasepr2_.ppr_id=purchasepr3_.ppr_id 
    where 
        this_.mac_code=? 
        and this_.cst_id=? 
    

    を、それはむしろ、データベースのフィールド名よりも、HQLを受け入れることができてとで適用されたときにはるかに優れているようだ、私は@Whereアプローチを断念し、代わりに@Filterを使用終わり、では:ここでは、これは動作しないでしょう基準クエリがありますエンティティレベルは関係に影響します(@Whereとは異なります)。

    関連する問題