Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

हाइबरनेट @OneToMany स्पष्ट रूप से तालिका इकाई में कहां क्लॉज जोड़ें?

मैंने SQL लॉगिंग चालू की और क्वेरी आउटपुट की जांच की। उपरोक्त मामले के लिए यह यह था:

/* 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(clause = "ppg_status <> 'D'")

हालांकि, यह पता चला है कि नहीं हाइबरनेट के रूप में काम करना गलत टेबल उपनाम को प्रीपेन्ड करता है:

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

दुर्भाग्य से एक बार एक उपनाम एक तालिका को सौंपा गया है, तो मूल तालिका नाम का उपयोग करना संभव नहीं है - इसलिए purchase_product_group.ppg_status <> 'D' काम नहीं करेगा। और मुझे हाइबरनेट द्वारा प्रोग्रामेटिक रूप से उपयोग किए जाने वाले उपनाम नाम को निर्धारित करने के तरीके के बारे में पता नहीं है - इसलिए वर्तमान में पसंद या तो हार्ड-कोड उपनाम नाम है जो हाइबरनेट द्वारा उपयोग किया जाता है (यानी 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=?

अंत में मैंने @Where . को छोड़ दिया दृष्टिकोण और प्रयुक्त @Filter इसके बजाय, जो बहुत बेहतर लगता है क्योंकि यह डेटाबेस फ़ील्ड नामों के बजाय HQL को स्वीकार कर सकता है और जब इसे इकाई स्तर पर लागू किया जाता है तो यह रिश्तों को प्रभावित करेगा (@Where के विपरीत) )।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. बूल समर्थन Oracle SQL

  2. ओरेकल में फोर्स आइडेंटिफ़ायर केस सेंसिटिविटी

  3. R12.2 . में असफल कटओवर चरण के बाद पैच को कैसे रोलबैक करें

  4. Regex101 बनाम Oracle Regex

  5. Oracle प्राकृतिक जुड़ता है और गणना करता है(1)