मैंने 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
के विपरीत) )।