स्थिति को देखते हुए: डेटाबेस बनाया गया था जब हाइबरनेट अभी तक पैदा नहीं हुआ था, हम यहां सच्ची विरासत की बात करते हैं। मेरे पास टेबल हैं जिन्होंने कभी भी रिकॉर्ड नहीं हटाए हैं, बस एक प्रविष्टि को चिह्नित करने के लिए पंक्ति पर एक सक्रिय ध्वज सेट कर रहे हैं जैसा कि वर्तमान में उपयोग में है। प्रश्न आमतौर पर इस तरह दिखते हैं:

SELECT * from A left join B on A.id = B.a_id and B.active = 1

जावा में परिभाषित एंटिटी ए और बी के साथ, और ए के पास एक संपत्ति है

@OneToMany
private Set<B> b; 

मैं मानदंड "और B.active=1" जोड़ने के लिए संपत्ति की व्याख्या कैसे करूं?

जेपीए-समाधान को प्राथमिकता दी गई, लेकिन यदि आवश्यक हो तो हम हाइबरनेट एनोटेशन का भी उपयोग कर सकते हैं।

इसी तरह से हमारे पास ऐसे मामले हैं जहां प्रविष्टियों की एक सक्रिय तिथि सीमा होती है, इसलिए हमें समान मानदंड जोड़ना होगा

"and B.active_From >= now() and (B.active_to is null or B.active_to < now())"
1
Kai 20 नवम्बर 2018, 08:22

1 उत्तर

सबसे बढ़िया उत्तर

आप किसी संघ से तत्वों को फ़िल्टर करने के लिए हाइबरनेट के @Where एनोटेशन का उपयोग कर सकते हैं। आपको इस हाइबरनेट टिप.

यहाँ इसका संक्षिप्त संस्करण है:

आप एक SQL स्निपेट को @Where एनोटेशन की clause विशेषता के मान के रूप में सेट कर सकते हैं। तो, आपकी मैपिंग इस तरह दिखनी चाहिए:

@OneToMany
@Where(clause = "active = 1")
private Set<B> b; 

और आप उसी दृष्टिकोण का उपयोग उन लोगों को बाहर करने के लिए कर सकते हैं जो समय सीमा के भीतर नहीं हैं

@OneToMany
@Where(clause = "active_from >= now() and (active_to is null or active_to < now())")
private Set<B> b; 
5
Thorben Janssen 20 नवम्बर 2018, 17:17